본문 바로가기
Algorithm/BAEKJOON

[백준/Python] 2292번 - 벌집

by code_pie 2024. 1. 2.
 

문제

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

 

육각형으로 이루어진 벌집이 있고, 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호가 주어진다. 이때 1에서 N번 방 까지 갈때 몇개의 방을 지나는지 구하는 문제

 

 

풀이

 

1을 기준으로 주변에 방은 6, 12, 18 ...개씩 6의 구구단 형식으로 늘어나는 것을 볼 수 있다.

이를 활용하면 정수 N이 주어졌을 때 1로부터 몇 칸 떨어져 있는지 구할 수 있다.

1 => 1

2~7 => 1+(1~6) *1로 부터 같은거리 만큼 떨어져 있는 수는 6개

8~19 => 1+6+(1~12) *1로 부터 같은거리 만큼 떨어져 있는 수는 12개

20~37=> 1+6+12+(1~18) *1로 부터 같은거리 만큼 떨어져 있는 수는 18개

...

1칸 떨어지면 6*1개의 수가 있고, 2칸 떨어진 곳에는 6*2개의 수가 있으므로, 이를 활용하면 몇 칸 떨어져있는지 계산 할 수 있다. 정수 N에서 2를 빼고 6으로 나눈 몫에 1을 더하면 1에서 몇 칸 떨어져 있는지 알 수 있다.

2~7 => 1칸 ((N-2)//6) + 1 == 1

8~19 => 2칸 2,3 ((N-2)//6) + 1 == 2,3

20~ 37=> 3칸 4,5,6 ((N-2)//6) + 1 == 4,5,6

...

여기서 1부터 N까지 더하는 규칙*을 활용하면

*(1=1), (1+2=3), (1+2+3 = 6)

1에서 3칸 떨어진 수의 ((N-2)/6)의 범위는

1+2 <((N-2)/6) <= 1+2+3 으로 나타남을 볼 수 있다.

1까지 포함한 칸의 수를 세면 정답이 나오므로 이를 코드로 바꿔서 작성했다.

 

Code

 
N=int(input()) #2~7(0~5) =>2 8~19(6~17) =>3 20~37=>4
if N==1:
    print(1)
else :
    N_6=int((N-2)/6)+1
    i=0
    while True:
        i +=1
        N_6-=i
        if N_6<=0:
            break
    print(i+1)

 

i가 1, 2, 3, 4 순으로 증가하며 칸을 찾아준다.

반응형