inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

11726 런타임 질문

해결된 질문

117

타이거

작성한 질문수 5

0

안녕하세요 강사님,

 

백준 11726번 관련 질문 드립니다.

 

노션에 나온 정답지는

# input
N = int(input())

# solve
dp = [0] * (N + 2)
dp[1] = 1
dp[2] = 2

for n in range(3, N + 1):
	dp[n] = (dp[n-1] + dp[n-2]) % 10007

print(dp[N])
 

으로 되어있습니다.

그런데 강의에서는 dp = [0] * (N + 2)부분이 dp = [0] * (N + 1)로 되어있습니다.

 

백준에 dp = [0] * (N + 1)로 제출하면 런타임 에러가 발생하는데,

그 이유를 알 수 있을까요?

dp[N]까지 접근하는건데, 0번째 인덱스를 고려한 N+1이아닌, N+2는 왜 필요한지 모르겠습니다.

(강의나 노션에 추가 설명이 보이지 않아서 여쭤봅니다)

 

감사합니다.

python 코딩-테스트 알고리즘

답변 2

0

알리 Ally

안녕하세요. 타이거님!

 

N에 상관없이 기본적으로 dp[0]과 dp[1]을 초기값 처리할 때 접근하기 때문입니다.

dp 배열의 크기를 N + 1로 한다면 N = 0일 때, dp[1]에 접근하지 못하기 때문에 런타임 에러가 나게 됩니다.

즉, N = 0일 때도 dp[1]까지 접근할 수 있게 하기 위해서 dp 배열의 크기를 N + 2로 했다고 생각하시면 됩니다.

 

비슷한 상황에 대한 설명이 섹션2의 '재귀함수 이해하기 [문제풀이] : BOJ 10870' 강의의 4:34 - 5:02 부분에 설명이 나와 있으니 참고하면 될 것 같습니다.

추가로 해당 부분에 대한 설명을 강의 자료에 추가해 놓겠습니다.

 

또 궁금하신 점 있으시면 언제든 질문 부탁드립니다.

감사합니다. :)

0

타이거

강사님 우선 답변 감사합니다!

 

추가 질문이 있습니다.

 

문제에서는 (1 ≤ n ≤ 1,000) 으로 n이 1부터 시작으로 되어있는데,

이 부분이랑 다른 이야기인가요?

0

알리 Ally

타이거님 추가 질문 감사합니다.
제가 이전 질문 답변을 잘못 달아드렸네요.

 

이전 답변과 원리는 동일한데요.

말씀해주신 것처럼 N의 범위가 1부터 시작하기 때문에 dp 배열의 크기를 N + 1로 한다면 N = 1일 때, dp[2]에 접근하지 못하기 때문에 런타임 에러가 나게 됩니다.

0

타이거

아 이해가 갔습니다.

답변 정말 감사드립니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

타이거님께서 질문하신 백준 11726번 문제의 런타임 에러에 대한 원인은 DP 배열의 길이가 문제의 요구사항을 충족하지 못하기 때문이라고 예상됩니다. 백준 문제에서는 피보나치 수열과 유사한 DP 문제의 특성상, N이 1 또는 2일 경우에도 문제 없도록 미리 초기화가 필요합니다.

기본적으로 dp = [0] * (N + 2)는 인덱스 에러를 방지하기 위한 안전 조치로, N이 작을 때도 배열 인덱스 접근 시 문제가 없도록 설계된 것입니다.

  • dp = [0] * (N + 1)로 설정하면, 예를 들어 N이 2일 때 dp[2]까지는 맞지만, 만약 루프에서 dp[n-1]dp[n-2]까지의 접근이 필요한 경우, 인덱스를 초과하게 되는 경우가 발생할 수 있습니다. 따라서 dp = [0] * (N + 2)로 배열을 선언하여 dp[n-2]까지의 계산에 대비하는 편이 안전한 방법입니다.

추가적으로 이러한 문제들은 각 언어의 인덱싱 특성과 문제에서 요구하는 초기값 설정의 이해가 필요합니다. 백준 문제에서는 다양한 언어로 실험하며 초기 설정을 기반으로 런타임 에러를 해결하는 것이 중요합니다.

질문자님의 이해를 돕고자 관련 내용을 참고할 수 있는 기존 답변 링크를 추천드립니다:
- 백준 DP 문제와 인덱스 에러 해결 게시글을 참조하여 배열 초기화에 대한 다양한 방법과 각 경우의 수에 대한 상세 설명을 확인해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Iterable 관련 설명 중 의문점

1

75

1

DP 알고리즘 index 0 이유?

0

82

2

백준에서 queue.PriorityQueue() 사용 시 런타임에러가 납니다.

0

78

2

(시간 초과) BOJ 1342 관련하여 질문이 있습니다

1

82

2

BFS, DFS

0

107

2

이중연결리스트에 관한 수업 내용도 있을까요?

0

98

1

영상에서 설명이 잘못됐고 자막이 맞는 내용이라고 자막에 표기

0

113

2

최대값 int(1e6, 1e7, 1e8) 기준

0

276

2

섹션 3 BOJ 1342 //= 연산자 관련

0

88

3

라이브러리 사용

0

118

2

2번 구현 방법 질문 있습니다.

0

170

1

브루트 포스 풀이

0

146

2

다익스트라 음수 간선

0

165

1

종료 조건

0

118

2

BOJ 1342 메모리초과 관련

0

124

2

진짜 엄청나네요. 이 가격에 새로운 컨텐츠 추가라니

0

216

1

섹션3 브루트포스 알고리즘 1342 풀이1 질문

0

153

2

boj 3020

0

129

1

강의 내용 중 백트래킹 존재 여부

0

157

1

제가 공부하는 방법이 괜찮은지 궁금합니다

1

264

2

DP 11053관련 질문있습니다.

0

124

1

17609 투포인터 문제를 재귀로 풀 경우가 궁금합니다!

0

143

3

3020번 풀이 코드관련 질문있어요

0

174

2

재귀 관련 문제 관찰할 때 질문

0

201

1