본문 바로가기
백준 알고리즘(BOJ)

백준 알고리즘 2292 (벌집) - python

by Think_why 2019. 10. 15.

[ 문제 ] 백준 알고리즘 2292 (벌집) - python

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

 

2292번: 벌집

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

www.acmicpc.net

 

주어진 N에 대하여 

N :     1  /  2 ~ 7  /  8 ~ 19  /  20 ~ 37  / ...

갯수 : 1개 /   6개  /   12개   /   18개   / ...

출력 :  1  /    2    /     3    /     4    / ...

 

1을 제외하고 +6개씩 누적되어 늘어나는 규칙을 보인다.

풀이 방법이 떠오른 건 2가지이다.

While문 이용 & 재귀 함수 이용

 

1. While문 이용

 

1일 때 조건을 설정하고 더해가도 되지만, 변수가 하나 더 필요할 것 같아서 N에서 6씩 누적해 빼가는 방식을 선택했다.

 

[ Code ]

N = int(input())
cnt = 1
while N > 1:
    N -= (6 * cnt)
    cnt += 1
print(cnt)

 

2. 재귀 함수 이용법

 

1을 제외하고 규칙적으로 증가하기 때문에, 탈출 조건을 잘 설정해주면 충분히 간단한 재귀로 해결이 가능하다.

python에서는 재귀함수가 깊어지면 런타임 에러가 발생할 수 있으므로 깊이 제한을 늘려주는 것이 필요하다.

 

[ Code ]

import sys
# Python의 경우, 재귀함수 깊이 제한 늘리기 필요
sys.setrecursionlimit(10**5)
N = int(input())
def bee_house(N, cnt):
    if N <= 1:
        print(cnt)
        return
    else:
        bee_house(N-(6*cnt), cnt+1)
bee_house(N, 1)
728x90

댓글