0. 문제
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 $R$칸, 가로 $C$칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 ($1$행 $1$열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의
www.acmicpc.net
문제
세로 칸, 가로 칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 ( 행 열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
입력
첫째 줄에 과 가 빈칸을 사이에 두고 주어진다. (1 ) 둘째 줄부터 개의 줄에 걸쳐서 보드에 적혀 있는 개의 대문자 알파벳들이 빈칸 없이 주어진다.
출력
첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.
예제 입력1
2 4
CAAB
ADCB
예제 출력1
3
예제 입력2
3 6
HFDFFB
AJHGDH
DGAGEH
예제 출력2
6
예제 입력3
5 5
IEFCJ
FHFKC
FFALF
HFGCF
HMCHH
예제 출력3
10
1. 풀이
1-1. recursive
R, C = map(int, input().split())
Map = []
for _ in range(R):
temp_list = input()
temp_list = list(temp_list)
Map.append(temp_list)
answer = 0
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
alphabets = set()
def solve(x, y, depth):
global answer
if depth < answer:
pass
else:
answer = depth
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < R and 0 <= ny < C and not Map[nx][ny] in alphabets:
alphabets.add(Map[nx][ny])
solve(nx, ny, depth+1)
alphabets.remove(Map[nx][ny])
alphabets.add(Map[0][0])
solve(0, 0, 1)
print(answer)
2. 결과
아쉽게도 예제 풀이에 대한 출력은 잘 나오지만 문제에서는 시간 초과가 발생한다. 해결 방법을 고민해봐야겠다.
'BOJ' 카테고리의 다른 글
[BruteForce] 6603번 로또 (4) | 2023.10.23 |
---|---|
[BruteForce] 2529번 부등호 (0) | 2023.10.08 |