Updated:

๐Ÿ–๏ธย 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 Common BackTracking

DP Tabulation BackTracking DP Tabulation BackTracking

์œ„์—๋Š” ๊ฐœ์„ ์ด์ „ ๊ฒฐ๊ณผ๊ณ  ์•„๋ž˜๋Š” ๊ฐœ์„  ์ดํ›„ ๊ฒฐ๊ณผ๋‹ค. ๋น„์•ฝ์ ์ธ ์†๋„ ์ƒ์Šนํ•˜๋Š” ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ ์—ญ์‹œ 3๋ฐฐ๋‚˜ ๋œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์Šต์ด๋‹ค. ์„ธํŠธ์— ์žˆ๋Š” ์œ ๋‹ˆํฌํ•œ ๊ฒฝ๋กœ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ์ด ์‹œ๋“œ์— ์˜ํ–ฅ(set.pop()์€ ๋žœ๋ค์œผ๋กœ ์›์†Œ ์„ ํƒ)์„ ๋ฐ›๋Š”๋‹ค๋Š” ์ ๋งŒ ๊ฐ์•ˆํ•œ๋‹ค๋ฉด ๋งค์šฐ ์ข‹์€ ํ’€์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

Leave a comment