Home [Python] 백준 2292번 : 벌집
Post
Cancel

[Python] 백준 2292번 : 벌집

Problem

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

Solution

오답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 해당 레이어의 벌집번호의 최댓값을 구하는 함수
def fibo(n):
    if n == 0:
        return 1
    else:
        return fibo(n-1) + 6*n

# 벌집이 속해있는 레이어를 구하는 함수
def find_layer(n):
    layer = 0
    if n<1:
        return 1

    while n > fibo(layer):
        layer += 1
    return layer + 1

n = int(input())
print(find_layer(n))

위 코드는 처음 작성한 코드인데 두개의 함수를 정의한 뒤에 재귀함수 형태로 값을 찾아나가는 방식이다. 예제로 주어진 값을 포함하여 테스트케이스를 입력했을 때는 정상 작동했지만 막상 코드를 제출하니 런타임 에러 (RecursionError) 가 발생했다. 입력되는 N값의 범위가 1 ≤ N ≤ 1,000,000,000 라는 것을 놓쳐서 발생한 문제였다. 파이썬의 재귀함수 최대 깊이는 sys.getrecursionlimit()를 통해 확인해보니 1000이었는데 그 범위를 넘어서서 에러가 발생한 것이다.

실제로 값을 입력해서 확인해보니 입력된 N의 값이 2979037일 때까지는 정상적으로 출력되지만 2979038이 입력됐을 때는 아래와 같은 에러메시지가 출력됐다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Traceback (most recent call last):
  File "code.py", line 16, in <module>
    print(find_layer(n))
  File "code.py", line 11, in find_layer
    while n>fibo(layer):
  File "code.py", line 5, in fibo
    return fibo(n-1) + 6*n
  File "code.py", line 5, in fibo
    return fibo(n-1) + 6*n
  File "code.py", line 5, in fibo
    return fibo(n-1) + 6*n
  [Previous line repeated 994 more times]
  File "code.py", line 2, in fibo
    if n == 0:
RecursionError: maximum recursion depth exceeded in comparison


정답 코드

1
2
3
4
5
6
7
8
9
n = int(input())

comb_num = 1  # 초기 벌집 개수
layer = 1

while n > comb_num :
    comb_num += 6 * layer  # 벌집 6의 배수로 증가
    layer += 1
print(layer)

Memo

계속 막혔던 문제여서 하단 블로거의 풀이를 본 뒤에야 해결할 수 있었다. 이 블로거는 재귀함수를 이용하여 레이어를 구하는 대신 while문에서 6 * layer만큼 벌집개수를 증가시키는 방법을 통해 문제를 해결하였다.

Ref.

https://ooyoung.tistory.com/82

This post is licensed under CC BY 4.0 by the author.

[Python] 백준 1361번 : 그룹 단어 체커

[Python] 백준 1929번 : 소수 구하기