코딩테스트

그래프 탐색 문제(경로 탐색)

temporubato108 2024. 9. 29. 20:30

 

N×M 크기의 게임판이 있습니다.

자동차 미니 게임은 장난감 자동차를 게임판에서 주행하는 게임입니다.

미니 게임에서 자동차가 주행하는 방법은 다음과 같습니다.

  • 게임판은 칸마다 0에서 9까지의 숫자가 적혀있습니다. 자동차는 한 번에 각 칸에 적힌 숫자만큼 전부를 이동하며 ↑, ↓, ←, → 방향 중 하나를 골라 움직일 수 있습니다.
  • 자동차가 다음으로 움직일 칸이 게임판 밖으로 나가거나 '0'이 적힌 칸인 경우 게임은 종료됩니다.
  • 왼쪽 위 (0,0)은 자동차의 출발지이며, 이 칸에 적힌 숫자는 0이 될 수 없습니다.
  • 미니 게임판을 줬을 때 자동차가 출발 전, 정차할 칸이 가장 많은 경로를 정합니다.
  • 게임이 종료될 때까지 정차한 칸의 개수를 출력하는 프로그램을 작성하세요.
  • 출발 칸도 정차한 칸의 개수에 포함합니다.

 

지시사항

입력

첫 번째 줄에 게임판의 세로 길이인 자연수 N, 가로의 길이인 자연수 M을 입력합니다. 1≤N,M≤50

두 번째 줄부터 게임판의 모양대로 숫자를 입력합니다.

출력

첫 번째 줄에 자동차가 정차한 칸의 개수 최댓값을 출력합니다.

자동차가 게임판에서 움직일 수 있는 칸이 무한대인 경우 "-1"을 출력합니다.

 

입력예시

3 5

26051

31264

52451

출력예시

2

 


import sys
sys.setrecursionlimit(2500)  # 재귀 깊이 설정 (필요 시 조정 가능)

def dfs(x, y, count):
    global max_count, infinite_loop
    if x < 0 or x >= N or y < 0 or y >= M or board[x][y] == 0:  # 경계검사 + 0칸 도착
        max_count = max(max_count, count - 1)
        return
    
    if in_progress[x][y]:  # 현재 탐색 경로에서 이미 방문한 경우 -> 무한 루프 발생
        infinite_loop = True
        return
    
    if visited[x][y] >= count:  # 이미 더 많이 방문한 적이 있는 경우
        return
    
    visited[x][y] = count
    in_progress[x][y] = True  # 현재 경로에 포함
    
    move = board[x][y]
    
    # 상, 하, 좌, 우 탐색
    dfs(x + move, y, count + 1)
    dfs(x - move, y, count + 1)
    dfs(x, y + move, count + 1)
    dfs(x, y - move, count + 1)
    
    in_progress[x][y] = False  # 경로에서 제외

N, M = map(int, input().split())
board = [list(map(int, input().strip())) for _ in range(N)]

visited = [[-1] * M for _ in range(N)]  # 각 칸을 방문한 적 있는지 추적
in_progress = [[False] * M for _ in range(N)]  # 현재 DFS 경로에서 방문 중인지 추적

max_count = 0
infinite_loop = False
dfs(0, 0, 1)

# 무한 루프가 감지된 경우
if infinite_loop:
    print(-1)
else:
    print(max_count)

 

 

이해 안되는 부분이 너무 많음.

함수부분은 거의 ChatGPT가 써준거 그대로 복붙했다.

 

이해 안되는 것 대충 메모

- sys모듈 기능

- setrecursionlimit()를 삭제했더니 하나의 테스트 케이스에서 오류가 발생한다. 이게 뭐길래?

- 깊이우선탐색(dfs) 예제 더 찾아보기

- dfs함수 전체적인 구조, 경계검사와 0칸 도착 시 max_count 와 count-1 비교, 왜 count-1??

- visited, in_progress 변수 내용 이해 안됨..

 

추후 공부해서 내용 추가할 예정.

'코딩테스트' 카테고리의 다른 글

모스부호(피보나치 수열)  (0) 2024.09.29
각 팀이 이기고 있는 시간 계산하기  (0) 2024.09.29
피보나치수 개수 확인문제  (0) 2024.09.28