Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
CAU 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

Develop/알고리즘

[백준] 9461 - 파도반 수열

sm_amoled 2021. 8. 10. 12:30

문제링크

https://www.acmicpc.net/problem/9461

문제

오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다.

파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다.

N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. (1 ≤ N ≤ 100)

출력

각 테스트 케이스마다 P(N)을 출력한다.

조건

  • 시간 제한 : 1s
  • 메모리 제한 : 128MB

해설

삼각형에 번호를 붙여보면, K번째 삼각형을 만드는 두 변은 K-1번째 삼각형과 K-5번째 삼각형의 변이다.

풀이

그림에서 삼각형에 번호를 붙여보면 K번째 삼각형을 만드는 두 변은 K-1번째 삼각형과 K-5번째 삼각형의 변이다.이를 수식으로 만들면 아래와 같다.

spiral[i] = spiral[i-1] + spiral[i-5];

여기에서는 i가 5 이상일때 만 커버가 가능하므로, 그 전의 값들은 직접 초기화해주었고, 4이하의 값이 들어왔을 때는 직접 해당 값들을 출력해준다.

if(n < 5) {
    cout << ((n-1)/3)+1 << "\n";
    return 0;
}

for(int i = 0; i<5; i++) {
    spiral[i] = i/3 + 1;
}
// 위 처럼 쓰면 배열에는 순서대로 1 1 1 2 2 가 들어가게 된다.

spiral[n-1]에는 원하는 변의 최대 길이가 들어있다. 이 값의 크기가 N이 최대인 경우 int로 담을 수 없으므로, spiral의 자료형은 long으로 선언해주어야 한다.

cout << spiral[n-1] << "\n";


코멘트

예전에는 이걸 DP를 안쓰고 어떻게 풀려고 시도했을까... 비록 시간초과는 났었지만 일반항을 찾으려고 노력하다니... 대단한 과거의 나였군... ㅋㅋㅋㅋ


코드

#include <iostream>
#include <vector>


using namespace std;

int main() {
    int t;
    cin >> t;
    for(int k = 0; k < t; k++) {
        int n;
        cin >> n;
        vector<long> spiral(n);
        
        if(n < 5) {
            cout << ((n-1)/3)+1 << "\n";
            continue;
        }
        
        for(int i = 0; i<5; i++) {
            spiral[i] = i/3 + 1;
        }
        
        for(int i = 5; i < n; i++) {
            spiral[i] = spiral[i-1] + spiral[i-5];
        }
        
        cout << spiral[n-1] << "\n";
    }
    return 0;
}

320x100

'Develop > 알고리즘' 카테고리의 다른 글

[백준] 11053 - 가장 긴 증가하는 부분 수열  (0) 2021.08.11
[백준] 2193 - 이친수  (0) 2021.08.10
[백준] 11727 - 2xn 타일링 2  (0) 2021.08.10
[백준] 2748 - 피보나치 수 2  (0) 2021.08.10
[백준] 11397 - ATM  (0) 2021.08.10