Algorithm (PS)
[백준] 1987 알파벳 in Python : 백트래킹 + 시간초과 해결하기..
minjiwoo
2022. 3. 1. 19:00
728x90
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
내가 바로 백트레킹이다 !!!! 하는 문제
dfs에서 경로에 현재 확인중인 array[nx][ny] 의 알파벳이 들어갈때 확인하고 다시 제거해서 원상복구한다
그러나 시간 초과가 났다... 또륵 괜히 level.5 문제가 아니다 ㅎ
# 1987 알파벳
r, c = map(int, input().split())
array = []
for _ in range(r):
array.append(input())
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
count = 1
alphabet = []
def dfs(x, y, cnt):
global count
count = max(cnt, count)
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < r and 0 <= ny < c:
if array[nx][ny] not in alphabet:
alphabet.append(array[nx][ny])
dfs(nx, ny, cnt+1)
alphabet.remove(array[nx][ny])
alphabet.append(array[0][0])
dfs(0, 0, count)
print(count)
해결 방법 :
in 연산자는 선형탐색이므로 여기서 시간 복잡도를 줄여주어야 한다
-> 알파벳을 26개의 칸으로 만들고 방문여부를 0, 1 로 구별한다
# 1987 알파벳
import sys
r, c = map(int, sys.stdin.readline().split())
array = [list(map(lambda x:ord(x)-65, input().rstrip())) for _ in range(r)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
count = 1
alphabet = [0] * 26
def dfs(x, y, cnt):
global count
count = max(cnt, count)
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < r and 0 <= ny < c and alphabet[array[nx][ny]] != 1:
alphabet[array[nx][ny]] = 1
dfs(nx, ny, cnt+1)
alphabet[array[nx][ny]] = 0
alphabet[array[0][0]] = 1
dfs(0, 0, count)
print(count)
728x90