diff --git a/workbook_8708/gold/1987-g4.py b/workbook_8708/gold/1987-g4.py new file mode 100644 index 0000000..509bf35 --- /dev/null +++ b/workbook_8708/gold/1987-g4.py @@ -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 하는 방식으로 했다. +질문 게시판을 보면 이렇게 하면 다 풀린다던데 네트워크가 느려서일 것 같았다. +일단 더 빠른 방법을 알아봤는데 비트마스크로 하면 더 빠르다고 한다. +그래서 비트마스크로 진행을 했고, 이때는 숫자를 넘겨주는 것이니까 복원 과정 필요 없이 업데이트된 숫자만 넘겨주면 된다. +근데 이렇게 해도 시간초과가 걸려서 네트워크 문제가 너무 심하다고 생각하며 끝냈다. +앞으로도 순서가 명확하고 사용 유무 같은 것을 기록할 일 있으면 비트마스크를 쓰면 좋을 것 같다. 물론 크기도 작은게 낫겠다. +""" \ No newline at end of file