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