백준 1987 문제 링크: https://www.acmicpc.net/problem/1987
📑 문제 설명
1. R, C 행렬이 주어지며 각 행렬은 알파벳으로 구성되어 있음
2. 좌측상단에서 시작하여 상, 하, 좌, 우로 한 칸씩 움직일 수 있으나 이미 지나친 알파벳은 또 지날 수 없음
3. 2번을 지키면서 좌측상단으로부터 가장 멀리 갈 수 있는 최대 거리 구하기
입력: 첫 번째 줄에 행, 열인 R과 C가 주어짐(공백으로 구분됨)
두번째 줄부터 R개 줄에 걸쳐서 보드에 적혀있는 C개의 대문자 알파벳이 빈칸 없이 주어짐 --> 대문자는 C개까지 출력되나 알파벳은 총 26개이므로 visited 배열에 26개 선언하고 시작해도 됨
출력: 최장 거리
💡 문제 해결 방법
알고리즘: DFS
알고리즘 선택 이유
1. 넓게 가는 것이 아닌 깊게 멀리 가야하기 때문에
2. 분기별로 최장 길이를 구하여 비교해야 하기 때문에
예외처리
스터디 내용
해결 방법
1. 알파벳만 visited 배열로 체크해 주면 됨 --> 굳이 이동하는 곳(즉 버택스는 체크 불필요)
2. 최장 거리를 비교해야 하기 때문에 방문을 완료했을 때 최적인지 아닌지 모르므로 백트래킹하여 최적의 거리 검색
3. DFS
💻 코드
import sys
r, c = list(map(int, sys.stdin.readline().split()))
graph = [[0 for x in range(c)] for x in range(r)]
for i in range(r):
temp = sys.stdin.readline()
for k in range(c):
graph[i][k] = temp[k]
visited = [False for x in range(26)]
def dfs(x, y, visited, depth):
global dist
dist = max(dist, depth)
n = graph[x][y]
visited[ord(n)-65] = True
adj_list = [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]
check = 0
for point in adj_list:
px = point[0]
py = point[1]
if px >= 0 and px < r and py >=0 and py < c:
n = graph[px][py]
if visited[ord(n)-65] == False:
check += 1
dfs(px, py, visited, depth + 1)
visited[ord(n)-65]=False
global dist
dist = 0
dfs(0, 0, visited, 1)
print(dist)
💟 추가적으로 알게 된 점