본문 바로가기
DEV/백준 알고리즘

백준 알고리즘 2292번(파이썬)

by 올커 2022. 10. 14.

 

백준 2292번_파이썬 알고리즘

Q. 백준 2292. 벌집

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


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

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

 

입력 예시 출력 예시
13 3

A. 풀이

# Q 백준 2292. 벌집 ★★
#  6 12 18 24 30 36
# 1 7 19 37 61 91 127
# 0 6 18 36 60 90 126
# 1 2  3  4  5  6   7

N = int(input())
cnt = 0
sum = 1

def mul6(x):
    return x * 6

if N == 1:
    print(1)
else:
    while sum < N:
        sum += mul6(cnt)
        cnt += 1
    print(cnt)

 - 벌집의 중앙부에서 해당 지점까지 최소로 방에 도달할 때, 지나가는 방의 수를 계산하는 문제이다.

 - 먼저 규칙을 확인해보면, 가운데 부터 각 방을 한 바퀴 회전하며 숫자가 1씩 증가하고, 각 층의 가장 마지막 수는 (1, 7, 19, 37, 61, 91, 127, ...)이다. 이 수들의 증감량은 (6, 12, 18, 24, 30, 36, ...)이다. 이 규칙을 활용하여 문제를 풀이하려 한다.

 

1) 변수 선언부

 - 먼저 도달해야 하는 방의 숫자를 int(input())을 활용해 입력받는다.

 - 각 층수는 cnt라는 변수를 생성하여 담으려 한다. 초기값은 0으로 잡았다. (cnt = 0)

   ※ Tip(1) : 

 

2) 함수 선언(def mul6(x))

 - 함수 mul6에서는 변수를 받아 6을 곱한다. 

   ※ Tip(1) : 

 

3) 조건문 (if문)

 - 입력받은 숫자 N이 1일 경우 1층이므로 1을 반환해주고, 아닌 경우는 else문에서 계산하도록 하였다.

 

4) 반복문(while문)

 - if문의 else:에서는 해당되는 층수를 구하기 위한 계산을 True일 경우 반복한다.

 - 만약 지정한 sum값 1ㅂ보다 N이 클 경우, cnt를 함수에 담아 sum에 담는다.

 - 계산을 완료하면 cnt에도 1을 더하고 다시 while문을 반복한다.

   이 식을 반복할 경우 sum에는 0 + 6 + 12 + 18 + ... 식으로 합이 쌓인다.

   또한, cnt 변수(층수)는 방 번호에 따라 1, 2, 3, 4, 5,. ..순으로 증가하게 된다.


R. 리뷰

 - 규칙 이해가 선행되어야 풀 수 있는 문제였다.

 - 증가하는 값을 변수에 저장하고, 규칙에 따라 적절히 증감시키는 것이 중요했다.

 - 함수를 사용해보았지만, 사실 함수를 사용하지 않고도 간단하게 풀이할 수 있다.

반응형

댓글