728x90

백준 2292번 벌집 문제

문제

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

 

풀이

 

처음엔 오잉? 했는데 등차수열의 합을 이용한 문제였다.

1을 중심으로 해서 숫자들이 구성되어 있다.

1번 거칠 경우는 주어진 수 n = 1
2번 거칠 경우는 주어진 수 n> 1 and n<=7
3번 거칠 경우는 주어진 수 n> 7 and n<= 19
4번 거칠 경우는 주어진 수 n>19 and n<= 37.....
a 번 거칠 경우는 주어진 수 n> 1 + (1 + 61) + .... + (1 + 6(a-2))

즉 주어진 수 n이 등차수열의 합보다 커지는 경우의 a를 구하면 된다.

 

처음에는 if n > 등차수열의 합으로 하려했지만, 우리가 구하려는 수는 n도 아니고, 등차수열의 합도 아니고 등차수열의 합을 이루는 변수 중 하나인 a 였다. 등차 수열의 공식 ( sum = n(2a + (n-1)d)/2 -> 여기서 n을 구해야 함) 를 활용하면 우리가 원하는 수를 구할 때 더 복잡해진다. 결국 반복문을 활용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
if n == 1:
    print(1)
else:
    end = 1
    d = 6
    count = 2
    while True:
        end += d
        if n <= end:
            print(count)
            break
        d += 6
        count += 1
cs

 

오랜만에 만나는 수열에 당황...

728x90

+ Recent posts