강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

너무어려워님의 프로필 이미지
너무어려워

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

7-J

7-J 질문드립니다.

작성

·

14

·

수정됨

0

안녕하세요 강사님

12865 재귀적으로 푸는 방법에 대한 질문이 있습니다.

https://www.acmicpc.net/source/99314596

저는 위와 같이 문제를 풀었더니, 시간초과가 발생하더라고요

 

그래서 강사님이 푸신 코드를 보니 dp 배열을 2차원으로 두고 푸셨는데, 제 풀이법과 어떠한 차이로 시간 복잡도에서 차이가 나는걸까요?

아니면 로직이 잘못되었을까요?

 

https://www.acmicpc.net/source/99312373

위 코드처럼 반복문으로 풀었을 때는 1차원 배열로 통과했는데, 재귀로 풀 때는 다르게 접근해야할까요..?

 

dp를 가장 어렵게 느껴서 항상 풀이법에 대한 고민이 있습니다...!

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 너무어려워님, 질문에 대해 답변 드리겠습니다.

재귀적으로 문제를 풀었을 때 시간 초과가 발생하는 이유는 주로 중복된 상태를 여러 번 계산하기 때문입니다. 일반적으로 동적 계획법(DP)에서 이런 중복 계산을 줄이기 위해 메모이제이션을 활용합니다. 메모이제이션은 이미 계산한 결과를 저장해 두고 같은 계산이 필요할 때 저장된 값을 사용하여 효율성을 높입니다.

  1. 재귀적 풀이와 메모이제이션 차이점: 재귀적으로 문제를 해결할 때, 상태를 저장하기 위한 메모이제이션 기법이 없으면 동일한 부분 문제를 여러 번 해결하는 문제가 발생합니다. 따라서, 메모이제이션을 통하여 이미 계산된 결과를 재사용할 수 있도록 해야 합니다.

  2. 반복문과 재귀의 차이: 반복문을 사용한 풀이에서는 이미 계산이 끝난 결과를 바탕으로 다음 결과를 계산하기 때문에 불필요한 중복 연산이 발생하지 않습니다. 그러나 재귀는 매번 새로운 함수 호출을 통해 이전의 값을 참조하고 계산을 반복하게 되므로, 메모이제이션이 반드시 필요합니다.

귀하의 재귀적 풀이가 시간 초과가 나는 것은, 아마도 이러한 메모이제이션이 제대로 구현되지 않아 발생한 것으로 보입니다. 참고로, 2차원 dp 배열을 사용하더라도 메모이제이션을 통해 필요한 값만 저장하고 사용하는 것이 중요합니다.

다음은 도움이 될 만한 관련 질문과 답변입니다:

  • 7-A 질문에서는 레퍼런스를 사용한 메모이제이션이 상태 저장에 어떻게 기여하는지를 설명합니다.
  • 2-S 질문드립니다에서는 DFS 문제에서 메모이제이션을 사용하지 않은 경우 시간 초과가 나는 예시를 해결하는 방법을 설명합니다.

이 외에도 메모이제이션에 대한 패턴은 많으니, 여러 예제를 통해 연습하시면서 익혀보시길 추천드립니다.

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

너무어려워님의 프로필 이미지
너무어려워

작성한 질문수

질문하기