๐ฉโ๐ป๐ [baekjoon] 1987๋ฒ: ์ํ๋ฒณ
๐๏ธย solution
import sys
from typing import List
def backtracking(y: int, x: int, count: int, visit: List, graph: List[List]):
global result
visit[ord(graph[y][x]) - 65] = True
result.add(count)
for i in range(4):
ny, nx = dy[i] + y, dx[i] + x
if -1 < ny < r and -1 < nx < c and not visit[ord(graph[ny][nx]) - 65]:
backtracking(ny, nx, count+1, visit, graph)
visit[ord(graph[ny][nx]) - 65] = False
r, c = map(int, sys.stdin.readline().split())
result = set()
dy, dx = (-1, 1, 0, 0), (0, 0, -1, 1)
grid, visited = [list(map(str, sys.stdin.readline().rstrip())) for _ in range(r)], [False] * 26
backtracking(0, 0, 1, visited, grid)
print(max(result))
๐กย idea
- Back Tracking
- 1) ๋ฐฉ๋ฌธ ๊ธฐ๋ก ๋ฐฐ์ด ๋ณ๊ฒฝ
- ์กฐ๊ฑด ์ค์์ ๊ฒฝ๋ก์ ์ํ๋ฒณ ์ค๋ณต์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ์ด์ฉ
- ์ ์ฒด ๊ฒฉ์ ์ฌ์ด์ฆ์ ๋์ผํ ๋ฐฐ์ด ๋์ ์ํ๋ฒณ ์ฌ์ด์ฆ(26)๋ง ์ ์ธ
์ผ๋ฐ์ ์ธ ๋ฐฑํธ๋ํน ๋ฌธ์ ๋ผ๊ณ ๋ณผ ์ ์๋ค. ํ์ง๋ง ํ์ด์ฌ์ผ๋ก ํด๊ฒฐํ๋ ค๋ ๊ฒฝ์ฐ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ์ ํ ๋๋ฌธ์ ๋นก์ผ ์ฝ๋ ์ต์ ํ๊ฐ ํ์ํ๋ค. ๊ฒฉ์ ๋ฌธ์ ๋ผ์ bfs
์ ํ๋ ๊ฐ๋ฅํ๋ฐ ๊ทธ๋ ๋ค๋ฉด python3
๋ก๋ ํด๊ฒฐ๊ฐ๋ฅํ๋ค. ํํธ, ์ผ๋ฐ์ ์ธ dfs
๋ผ๋ฉด ๋นก์ผ ์ต์ ํ๋ฅผ ํตํด pypy3
์ผ๋ก๋ง ํต๊ณผ ๊ฐ๋ฅํ๋ค.
๋ฌธ์ ๋ฅผ ๋ฆฌ๋ทฐํ๋ ๋์ค ์ผ๋ฐ์ ์ธ dfs
๋ฐฑํธ๋ํน ๋ฐฉ์์ ๋นํจ์จ์ฑ์ ๋ํด ๊ณ ์ฐฐํด๋ดค๋ค. ์๋์ ๊ฐ์ ์
๋ ฅ์ด ์๋ค.
IEFCJ
FHFKC
FFALF
HFGCF
HMCHH
์ผ๋ฐ์ ์ธ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํ๋ ๊ณผ์ ์ ์๊ฐํด๋ณด์. ๋นจ๊ฐ์์ผ๋ก ์น ํด์ง ๊ธ์๋ฅผ IFHE
์์๋ก ํ์ํ๋ค๋ฉด, ๋ค์์ F
๋ฅผ ํ์ํด ๋ฐฉ๋ฌธํด๋ ๋๋์ง ์ฌ๋ถ๋ฅผ ํ์ ํ ๊ฒ์ด๋ค. ์ด๋ฏธ F
๋ ๋ฐฉ๋ฌธํ๊ธฐ ๋๋ฌธ์ ์๋ง๋ ์คํ ํ๋ ์ ํ ๋น์ ์ทจ์ํ๋ฉด์, ๊ฒฐ๊ตญ์๋ I
๊น์ง ๋๋์ ๊ฐ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์ค๋ฅธ์ชฝ์ ์๋ E
๋ฅผ ๋ฐฉ๋ฌธํ ๋ค, FCK
์์๋ก ๋ฐฉ๋ฌธํ๊ฒ ๋ ๊ฒ์ด๋ค. ์ด ๋ ๋ค๊ฒ ๋๋ ์๋ฌธ์ ๋ฐ๋ก ์ด๋ ๋ค. ๊ตณ์ด I
๊น์ง ๋๋์๊ฐ๋ค๊ฐ ํ์ํด์ผ ํ ๊น?? ์ด๋ฏธ IE
๋ ํ์์ด ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ผ๋ ๊ฒ์ ์ฐ๋ฆฌ๋ ์ถฉ๋ถํ ์ ์ ์๋ค. ๋ฐ๋ผ์ DP Tabulation
๊ฐ๋
์ ์ฐจ์ฉํ๋ค๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ํ์ด๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๊ฒฝ๋ก์ ์ ์ผ์ฑ์ ๋ณด์ฅํ๋ฉด์ ์์ ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด ๋์ ์ธํธ๋ฅผ ์ฌ์ฉํด๋ณด์. ์ธํธ์๋ ํ์ฌ๊น์ง์ ๊ฒฝ๋ก ๊ทธ๋ฆฌ๊ณ ํด๋น ๊ฒฝ๋ก์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํด์ค์ผ ํ๋ค. ๊ฐ์ ๊ฒฝ๋ก๋ผ๊ณ ํ ์ง๋ผ๋ ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค์ ์ํด ๋ง๋ค์ด์ก์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ ์ธํธ๋ฅผ ๊ตฌ์ฑํ ๋ค, ํ๋์ฉ popํด์ ๊ฒฝ๋ก๋ฅผ ์ป์ด๋ธ๋ค. ๊ทธ ๋ค์ ํด๋น ๊ฒฝ๋ก๋ก๋ถํฐ ํ์๋๋ ์ฌ๋ฌ ์ ์ฌ์ ๊ฒฝ๋ก๋ค์ ๋ชจ๋ ๊ฒ์ฌํด ๊ฒฝ๋ก๊ฐ ๋ง๋ค์ด์ง ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ ํ๋ฉด ๋๋ค. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import sys
def dfs(y: int, x: int) -> int:
dp, result = set(), 0
dp.add((y, x, grid[y][x]))
while dp:
vy, vx, path = dp.pop()
result = max(result, len(path))
if result == 26:
return 26
for i in range(4):
ny, nx = dy[i] + vy, dx[i] + vx
if -1 < ny < r and -1 < nx < c and grid[ny][nx] not in path:
dp.add((ny, nx, grid[ny][nx] + path))
return result
r, c = map(int, sys.stdin.readline().split())
dy, dx = (-1, 1, 0, 0), (0, 0, -1, 1)
grid = [list(map(str, sys.stdin.readline().rstrip())) for _ in range(r)]
print(dfs(0, 0))
Common BackTracking
DP Tabulation BackTracking
์์๋ ๊ฐ์ ์ด์ ๊ฒฐ๊ณผ๊ณ ์๋๋ ๊ฐ์ ์ดํ ๊ฒฐ๊ณผ๋ค. ๋น์ฝ์ ์ธ ์๋ ์์นํ๋ ๋์์ ๋ฉ๋ชจ๋ฆฌ ์ญ์ 3๋ฐฐ๋ ๋ ์ฌ์ฉํ๋ ๋ชจ์ต์ด๋ค. ์ธํธ์ ์๋ ์ ๋ํฌํ ๊ฒฝ๋ก๋ค์ ํ๋์ฉ ๊บผ๋ด๋ ๋ฐฉ์์ ์ ํํ๊ธฐ ๋๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ์ด ์๋์ ์ํฅ(set.pop()
์ ๋๋ค์ผ๋ก ์์ ์ ํ)์ ๋ฐ๋๋ค๋ ์ ๋ง ๊ฐ์ํ๋ค๋ฉด ๋งค์ฐ ์ข์ ํ์ด๋ผ๊ณ ์๊ฐํ๋ค.
Leave a comment