Skip to content

토끼가 정보섬에 올라온 이유#87

Open
asqwklop12 wants to merge 1 commit intomainfrom
0305
Open

토끼가 정보섬에 올라온 이유#87
asqwklop12 wants to merge 1 commit intomainfrom
0305

Conversation

@asqwklop12
Copy link
Owner

유형: dfs, dp
등급: 골드
url: https://www.acmicpc.net/problem/17130

오늘 부터 AI 리뷰를 올려 놓도록 하겠습니다.~~~

문제 분석

  • 핵심 알고리즘: 다이나믹 프로그래밍(DP) / DFS + Memoization
  • 주요 조건:
    • 토끼는 무조건 다음 열(j+1)로만 이동 가능 (DAG 구조).
    • 이동 범위는 행 방향으로 -1, 0, +1 변화 가능.
    • 탈출구('O')가 여러 개일 수 있으며, 탈출구에 도착한 시점들 중 당근('C')을 가장 많이 먹은 개수를 구해야 함.
    • 어떤 탈출구에도 도달할 수 없으면 -1 반환.

구현 전략

  • Top-down DP (DFS + Memoization):
    • memo[n][m] 배열을 -1로 초기화하여 중복 계산 방지.
    • dfs(x, y) 함수는 (x, y) 위치에서 도달 가능한 탈출구까지의 최대 당근 개수를 반환.
    • 상태 정의: res = -2를 도달 불가능 상태로 정의하고, 구멍('O')을 발견하면 res = 0으로 탐색 시작.
    • 전이: 세 방향 탐색 후 결과가 -2가 아닌 경우에만 현재 위치의 당근 개수를 더해 최댓값(Math.max) 갱신.

트러블슈팅

  1. 입력 파싱 오류: 문제의 격자 데이터가 공백 없이 주어지는데, 초기 스크립트가 int[]로 오판함. char[][]로 변경하여 해결.
  2. 도달 여부 식별: 구멍에 도달하여 당근 0개를 얻은 경우와, 아예 구멍에 가지 못한 경우를 -1-2 등으로 구분하지 않아 샘플 2번에서 오답 발생. 초기값을 -2로 설정하고 전파하여 성공한 경로만 추적하도록 수정.
  3. 구멍 이후 탐색: 구멍('O')을 만났을 때 바로 리턴하면 그 뒤에 있는 더 유리한 구멍을 놓침. 구멍을 만나도 res=0으로 세팅 후 다음 칸 탐색을 계속하도록 로직 보강.
  4. 멤버 변수 충돌: res를 클래스 멤버 변수로 써서 재귀 호출 간 값이 덮어씌워지는 문제 발생. 지역 변수로 변경하여 독립성 확보.

강점 및 약점

  • 강점: 복잡한 격자 이동 규칙을 DAG 구조로 이해하고, TLE를 피하기 위해 메모이제이션을 적재적소에 도입함.
  • 약점: 재귀 호출의 리턴값과 실패 상태(-2) 간의 관계를 정리하는 데 시간이 다소 소요됨.

AI 도움 임계점

  • 실패 상태 설계: 도달 불가능한 경로를 특정 상수(-2 또는 -987654321)로 리턴하여 Math.max 비교에서 제외하도록 하는 힌트가 결정적이었음.

추천 문제 (학습 흐름 연계)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant