[ 문제 ] 백준 알고리즘 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)
'백준 알고리즘(BOJ)' 카테고리의 다른 글
백준 알고리즘 2869 (달팽이는 올라가고 싶다) - python (0) | 2019.10.15 |
---|---|
백준 알고리즘 1011 (Fly me to the Alpha Centauri) - python (0) | 2019.10.15 |
백준 알고리즘 1193 (분수찾기) - python (0) | 2019.10.15 |
백준 알고리즘 2839 (설탕 배달) - python (0) | 2019.10.15 |
백준 알고리즘 1712 (손익분기점) - python (0) | 2019.10.15 |
댓글