From 10f0cfc8123023f23501af795e9b0c6ddf10c21c Mon Sep 17 00:00:00 2001 From: SSUM <116950962+ssum21@users.noreply.github.com> Date: Sun, 30 Mar 2025 11:59:28 +0900 Subject: [PATCH] =?UTF-8?q?[Gold=20IV]=20Title:=20=EC=95=8C=ED=8C=8C?= =?UTF-8?q?=EB=B2=B3,=20Time:=206020=20ms,=20Memory:=20163928=20KB=20-Baek?= =?UTF-8?q?joonHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 백준/Gold/1987. 알파벳/README.md | 32 ++++++++++++++++++++++++++ 백준/Gold/1987. 알파벳/알파벳.py | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 백준/Gold/1987. 알파벳/README.md create mode 100644 백준/Gold/1987. 알파벳/알파벳.py 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 + +### 문제 설명 + +

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (11열) 에는 말이 놓여 있다.

+ +

말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.

+ +

좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.

+ +### 입력 + +

첫째 줄에 RC가 빈칸을 사이에 두고 주어진다. (1R,C20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.

+ +### 출력 + +

첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.

+ 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)