백준 - 2292번 벌집(수학, 점화식)

Kiwoong Park·2023년 6월 7일
0

문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

C++ 풀이

1을 시작으로 6씩 증감되며 단계가 올라가는 수열로 생각하였다.
Ex.
1 : 1
2 : 2 - 7 (1+6)
3 : 8 - 19 (1+6+12)
4 : 20 - 38 (1+6+12+18)
이런식의 규칙을 가지므로 수열의 점화식으로 표현하면

Tn=Tn1+6(n1)TnTn1=6(n1)Tn1Tn2=6(n2)...T2T1=6(1)Tn=3(n1)n+T1T_n = T_{n-1} + 6(n-1) \\ T_n - T_{n-1} = 6(n-1) \\ T_{n-1} - T_{n-2} = 6(n-2) \\ ... \\ T_2 - T_1 = 6(1) \\ \rarr T_n = 3(n-1)n + T_1

위와 같은 일반항을 구할 수 있고, 이를 프로그래밍으로 n을 1씩 증가하면서 m단계의 상태인지를 비교하는 코드를 짜면 아래와 같다.

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int N,m=1;
    cin >> N;
    while(N>3*m*(m-1)+1)
        m++;
    cout << m;
}
profile
You matter, never give up

0개의 댓글