본문 바로가기
BOJ

[BruteForce] 1987번 알파벳

by Hyojuuun 2023. 11. 20.

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