1987-g4 성공

This commit is contained in:
2026-03-18 15:23:20 +09:00
parent b0ec14828b
commit 409f293091

View File

@@ -0,0 +1,58 @@
# 알파벳
import sys
input = sys.stdin.readline
def solution():
r, c = map(int, input().rstrip().split())
grid = [[1 << (ord(ch)-65) for ch in input().rstrip()] for _ in range(r)]
dr = [1, -1, 0, 0]
dc = [0, 0, 1, -1]
result = 0
def dfs(now_r, now_c, mask, depth):
is_last = True
for i in range(4):
nxt_r, nxt_c = now_r + dr[i], now_c + dc[i]
if 0 <= nxt_r < r and 0 <= nxt_c < c:
now_bit = grid[nxt_r][nxt_c]
if mask & now_bit:
continue
dfs(nxt_r, nxt_c, mask | now_bit, depth+1)
is_last = False
if is_last:
nonlocal result
result = max(result, depth)
return
dfs(0, 0, grid[0][0], 1)
print(result)
return
solution()
"""
걸린 시간: 1시간
시간 복잡도: 최대로 멀리 갈 수 있는게 알파벳 개수인 26개에 매번 경우의 수는 4이므로 O(4^26)이지만
방문한 것들은 안가고 그러면 저것보다는 작을 것 같다.
해설: 처음에는 아무생각 없이 bfs로 진행했다가 갈 수 있는 거리의 최대치를 생각해보니까 dfs로 다 봐야할 것 같았다.
visited는 set으로 관리하면서 copy를 해서 넘겨주는 식으로 재귀 dfs를 했는데(사실상 백트래킹이지..) 시간초과가 났다.
생각해보니 계속 copy를 하면 시간이 너무 걸릴 것 같아서 백트래킹 정석대로 dfs 전에 add, 후에 remove 하는 방식으로 했다.
질문 게시판을 보면 이렇게 하면 다 풀린다던데 네트워크가 느려서일 것 같았다.
일단 더 빠른 방법을 알아봤는데 비트마스크로 하면 더 빠르다고 한다.
그래서 비트마스크로 진행을 했고, 이때는 숫자를 넘겨주는 것이니까 복원 과정 필요 없이 업데이트된 숫자만 넘겨주면 된다.
근데 이렇게 해도 시간초과가 걸려서 네트워크 문제가 너무 심하다고 생각하며 끝냈다.
앞으로도 순서가 명확하고 사용 유무 같은 것을 기록할 일 있으면 비트마스크를 쓰면 좋을 것 같다. 물론 크기도 작은게 낫겠다.
"""