본문 바로가기

알고리즘 문제

백준 알고리즘 벌집 2292번

문제

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

입력

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

출력

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

예제 입력 

13

예제 출력 

3




시험기간에 머리 식힐 겸 풀어봤다. 규칙은 금방 찾았으나 코드로 어떻게 옮겨야하나 2시간(?) 동안 머리 터지는 줄 알았다.




방을 벗어나기 위한 거리를 육각형으로 묶었다.

빨 주 노 초로 갈수록 1씩 거리가 늘어나는 것이다.

분홍색 화살표로 표시한 부분은 육각형 범위를 벗어날 때 어떤 규칙이 있는지 알아보기 위해 표시했다.

1에서 2로 가는건 나중에 1을 더해버리고

2부터 시작한다고 생각하면 6, 12, 18 이런식으로 등비수열이 있다는 걸 알 수 있다.

고로 입력된 값을 따라잡는 어떤 규칙을 갖는 숫자를 만들어 비교하면 된다.

따라 잡는 동안 카운트를 해서 거리를 세준다.

그 규칙을 갖는 숫자에 1을 더한 값이 입력된 값보다 크다면 그때의 카운트가 답이 된다.


소스코드


N = int(input())

sum = 0

count = 0

while N > sum: #입력 값이 등비수열 6의 누적 값보다 큰 동안 반복

    sum += count*6 #6의 배수를 누적

    count +=1

    if N <= sum+1: #누적된 값 +1 이 입력 값보다 크거나 같다면 같은 범위 안에 있는 것이므로

        print(count) #거리를 출력한다

        break #break로 while문에서 벗어난다