본문 바로가기
👩🏻‍💻 Front-end/👾 Algorithm

백준 2292 - 벌집 (Python)

by su-no 2022. 5. 5.

문제

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

 

 

입력

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

 

출력

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

 

풀이

n = int(input())

sum = 1
i = 1

while(n != 1):
    sum += 6*i
    if sum >= n:
        break
    i += 1

if n == 1:
    print(1)
else:
    print(i+1)

문제를 언뜻 보면 최단거리 구하기 같지만, 단순하게 육각형이 점점 더 커진다고 생각했을 때 주어진 숫자가 몇 번째 육각형에 있는지를 구하면 된다.

1 1  
2 2~7 +6
3 8~19 +12
4 20~37 +18
5 38~61 +24

위 표와 같이 1부터 시작해서 +6, +12, +18,,, 6n만큼 커져가며 육각형을 이룬다.

입력되는 수의 범위는 1 ≤ N ≤ 1,000,000,000 이니까 시간복잡도 측면에서도 2초면 충분하다고 판단된다.

그러니까 while문으로 직접 육각형을 그려가면서, 주어진 숫자가 위치한 육각형에 다다르면 break하고 n+1을 출력해주자!

 

생각

진짜 간단한데 입력이 1일 때 예외처리를 해주지 않아 틀렸다..^ㅡ^

언제쯤 꼼꼼하게 모든 케이스를 맞출 수 있을까!