diff --git a/백준/Gold/1987. 알파벳/README.md b/백준/Gold/1987. 알파벳/README.md new file mode 100644 index 0000000..ba81616 --- /dev/null +++ b/백준/Gold/1987. 알파벳/README.md @@ -0,0 +1,32 @@ +# [Gold IV] 알파벳 - 1987 + +[문제 링크](https://www.acmicpc.net/problem/1987) + +### 성능 요약 + +메모리: 163928 KB, 시간: 6020 ms + +### 분류 + +백트래킹, 깊이 우선 탐색, 그래프 이론, 그래프 탐색 + +### 제출 일자 + +2025년 3월 30일 11:57:25 + +### 문제 설명 + +
세로
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
+ +좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
+ +### 입력 + +첫째 줄에
첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.
+ diff --git a/백준/Gold/1987. 알파벳/알파벳.py b/백준/Gold/1987. 알파벳/알파벳.py new file mode 100644 index 0000000..c419b8b --- /dev/null +++ b/백준/Gold/1987. 알파벳/알파벳.py @@ -0,0 +1,39 @@ +import sys + +# 상하좌우 이동 좌표 +dx = [0, 1, 0, -1] +dy = [1, 0, -1, 0] + +# 입력 받기 +r, c = map(int, sys.stdin.readline().split()) +graph = [list(sys.stdin.readline().strip()) for _ in range(r)] + +# 방문한 알파벳을 체크할 배열 (26개 알파벳) +visited_alpha = [False] * 26 + +# 최대 경로 길이를 저장할 변수 +answer = 0 + +def dfs(x, y, count): + global answer + answer = max(answer, count) # 현재까지의 경로 길이 중 최대값 갱신 + + for i in range(4): # 4방향 탐색 + nx = x + dx[i] + ny = y + dy[i] + + if 0 <= nx < r and 0 <= ny < c: + next_alpha = ord(graph[nx][ny]) - ord('A') + if not visited_alpha[next_alpha]: # 아직 방문하지 않은 알파벳이라면 + visited_alpha[next_alpha] = True + dfs(nx, ny, count + 1) + visited_alpha[next_alpha] = False # 백트래킹 (되돌리기) + +# 시작 위치의 알파벳 방문 체크 +visited_alpha[ord(graph[0][0]) - ord('A')] = True + +# DFS 시작 +dfs(0, 0, 1) + +# 정답 출력 +print(answer)