[ 백준 1987 ] 알파벳
문제
정말 오랜만에 풀어본 알고리즘 문제...
파이썬 문법부터 헷갈려서 구글링을 해가며 풀었다😂
풀이
틀린 풀이
import sys
from collections import deque
input = sys.stdin.readline
d = ((1, 0), (-1, 0), (0, 1), (0, -1))
R, C = map(int, input().split())
arr = [list(input()) for _ in range(R)]
x, y = 0, 0
queue = set()
queue.add((x, y, arr[0][0]))
visited = {(x, y)}
answer = 1
while queue:
x, y, alpha = queue.pop()
answer = max(answer, len(alpha))
for i in range(4):
nx = x + d[i][0]
ny = y + d[i][1]
if nx < 0 or nx >= R or ny < 0 or ny >= C:
continue
if (nx, ny) in visited or arr[nx][ny] in alpha:
continue
visited.add((nx, ny))
queue.add((nx, ny, alpha + arr[nx][ny]))
print(answer)
최단경로를 찾는 문제와 풀이를 헷갈려서 저런식으로 풀어놨다.
if (nx, ny) in visited
이런식으로 방문체크를 했던 것이 잘못이었다.
이 문제는 최단경로를 찾는 문제와 달리 어떤 지점에서 앞으로 몇 칸 갈 수 있는지는 이전 경로에 따라 달라지기 때문에, 다른 경로에서 이미 가본 칸이라고 해서 넘겨버려서는 안 된다...
맞는 풀이
import sys
from collections import deque
input = sys.stdin.readline
d = ((1, 0), (-1, 0), (0, 1), (0, -1))
R, C = map(int, input().split())
arr = [list(input()) for _ in range(R)]
x, y = 0, 0
queue = set()
queue.add((x, y, arr[0][0]))
answer = 1
while queue:
x, y, alpha = queue.pop()
answer = max(answer, len(alpha))
for i in range(4):
nx = x + d[i][0]
ny = y + d[i][1]
if nx < 0 or nx >= R or ny < 0 or ny >= C:
continue
if arr[nx][ny] in alpha:
continue
queue.add((nx, ny, alpha + arr[nx][ny]))
print(answer)
각각의 라운드에서 지나온 경로(alpha)에 다음 알파벳이 포함되어있는지를 체크하면, 굳이 방문체크를 할 필요가 없다!
출처
참고한 코드: 1987 - 알파벳 - 파이썬
Author And Source
이 문제에 관하여([ 백준 1987 ] 알파벳), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jua0610/백준-1987-알파벳저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)