코딩 연습

[백준 2292] 벌집 / 파이썬

MoreauK 2022. 8. 30. 18:39

시간제한 : 2초

메모리제한 : 128MB

문제 :

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

입력 : 첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

출력 : 입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.


풀이

N번째 방을 가기 위해 지나가야 하는 방의 숫자는 그 방이 속한 테두리의 수열로 구할 수 있다.

가령, 두 번째 육각형에 속한 7번 방까지 가기 위해 지나가야 하는 방의 숫자는 2, 네 번째 육각형에 속한 24번 방까지 지나가기 위해 지나가야 하는 방의 숫자는 4이다. 

 

n번째 육각형에 포함되는 방의 숫자는

n=1일때 1, n=2일때 7(1 + 6), n=3일때 19(1+6+12), n=4일때 37(1+6+12+18)...로,

수열 a(n)은 n이 1일 때, a(n)=1, n이 2 이상일 때는 6 * 2(n-1)인 수열의 합으로 표현할 수 있다.

 

따라서 a(n)은 3 n(n-1)+1이 된다.

 

이제 주어진 방의 번호 N이 n번째 육각형에 속한 방의 번호보다 작아질 때까지 while 반복문을 돌린 후, while 반복문이 멈췄을 때의 n 값을 출력하면 값을 구할 수 있다.

N = int(input())

n = 1
rooms = 1

while N > steps:
    n += 1
    rooms = 1 + 3 * n * (n-1)
print(n)