[PS] BOJ 1987 / 알파벳

[PS] BOJ 1987 / 알파벳
문제 링크: https://www.acmicpc.net/problem/1987
Thumbnail: Photo by Surendran MP (Unsplash)

그래프 탐색 문제입니다.

풀이

DFS

\(R \times C\) 크기의 격자에 임의의 알파벳들이 채워져 있습니다. \((0, 0)\)에서 탐색을 시작해, 한 번 지나간 알파벳을 다시 지나가지 않는 선에서 갈 수 있는 최대 길이를 구해야 하는 문제입니다.

DFS를 진행하면서, 방문 여부를 'A'부터 'Z'까지의 알파벳에 대해 검사하고, 만약 이번 재귀에서 더이상 탐색할 수 없다면 최대 길이를 갱신하는 방법으로 구현했습니다.

전체 코드

input = open(0).readline
R, C = map(int, input().split())
board = [list(input().rstrip()) for _ in range(R)]  # R x C 크기의 격자.

A_idx = ord('A')
visited = {chr(A_idx + i): False for i in range(26)} # 방문 여부를 검사할 Map

result = 0  # 가장 긴 경로의 길이
def dfs(y, x, distance = 1):
    next_dfs = 0
    for dy, dx in ((-1, 0), (1, 0), (0, -1), (0, 1)):
        ny, nx = y + dy, x + dx
        if 0 <= ny < R and 0 <= nx < C:
            if not visited[board[ny][nx]]:
                next_dfs += 1
                visited[board[ny][nx]] = True
                dfs(ny, nx, distance + 1)
                visited[board[ny][nx]] = False
    if next_dfs == 0:  # 더 이상 갈 곳이 없는 경우.
        global result
        result = max(result, distance)

visited[board[0][0]] = True  # 시작 위치 방문 처리
dfs(0, 0)
print(result)  # 가장 긴 경로의 길이 출력