728x90
#1987 알파벳 (https://www.acmicpc.net/problem/1987)
과거 소마를 준비하던 시절 포기했던 문제였다.
틀린 코드
r, c = map(int, input().split())
graph = [[x for x in input()] for _ in range(r)]
alpha = set(graph[0][0])
dr = [1, -1, 0, 0]
dc = [0, 0, 1, -1]
answer = 0
def solve(x,y, length):
global answer
answer = max(answer, length)
for i in range(4):
nr = x + dr[i]
nc = y + dc[i]
if 0 <= nr < r and 0 <= nc < c and not graph[nr][nc] in alpha:
alpha.add(graph[nr][nc])
solve(nr, nc, length+1)
alpha.remove(graph[nr][nc])
solve(0, 0, 1)
print(answer)
무엇이 문제였을까??
아무리 생각해도, set을 사용하는 과정에서 remove, in 등을 사용했기 때문으로 보인다. ( O(n) )
문뜩, 그런 생각이 들었다.
왜 알파벳으로 맵을 만들었을까?
알파벳은 순서가 있어, index로 응용할 수 있다.
아.. 이거구나..
정답코드
import sys
input = sys.stdin.readline
r, c = map(int, input().split())
graph = [[x for x in input()] for _ in range(r)]
alpha = [0] *26
alpha[ord(graph[0][0]) - ord("A")] = 1
dr = [1, -1, 0, 0]
dc = [0, 0, 1, -1]
answer = 0
def solve(x,y, length):
global answer
answer = max(answer, length)
for i in range(4):
nr = x + dr[i]
nc = y + dc[i]
if 0 <= nr < r and 0 <= nc < c :
idx = ord(graph[nr][nc]) - ord("A")
if alpha[idx] == 0:
alpha[idx] = 1
solve(nr, nc, length+1)
alpha[idx] = 0
solve(0, 0, 1)
print(answer)
알파벳을 인덱스로 사용했더니, 시간초과를 면할 수 있었다.
문제에 데이터가 알파벳으로 주어진다면, 고정된 리스트를 만들고 알파벳을 인덱스로 활용해야겠다는 아이디어로 연결될 필요가 있지 않을까?
'Algorithm > acmicpc.net' 카테고리의 다른 글
그래프는 맨날까먹어~ (#1197) (1) | 2024.10.08 |
---|---|
난 외로울 때 힙합을 해.. (#1715) (0) | 2024.10.08 |
버블정렬과 합병정렬을 완전히 이해한다면 (#1517) (1) | 2024.09.06 |
DP는 점화식을 찾는게 힘들어... 근데 분할정복임 (#11444) (0) | 2024.08.14 |
2차원 DP (#11660) (0) | 2024.08.13 |