1987-g4 성공
This commit is contained in:
58
workbook_8708/gold/1987-g4.py
Normal file
58
workbook_8708/gold/1987-g4.py
Normal 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 하는 방식으로 했다.
|
||||
질문 게시판을 보면 이렇게 하면 다 풀린다던데 네트워크가 느려서일 것 같았다.
|
||||
일단 더 빠른 방법을 알아봤는데 비트마스크로 하면 더 빠르다고 한다.
|
||||
그래서 비트마스크로 진행을 했고, 이때는 숫자를 넘겨주는 것이니까 복원 과정 필요 없이 업데이트된 숫자만 넘겨주면 된다.
|
||||
근데 이렇게 해도 시간초과가 걸려서 네트워크 문제가 너무 심하다고 생각하며 끝냈다.
|
||||
앞으로도 순서가 명확하고 사용 유무 같은 것을 기록할 일 있으면 비트마스크를 쓰면 좋을 것 같다. 물론 크기도 작은게 낫겠다.
|
||||
"""
|
||||
Reference in New Issue
Block a user