λ°±μ€€ 1987 μ•ŒνŒŒλ²³ 파이썬

2022. 7. 8. 00:03γ†πŸ”± Algorithm/Back tracking

https://www.acmicpc.net/problem/1987

 

1987번: μ•ŒνŒŒλ²³

μ„Έλ‘œ RμΉΈ, κ°€λ‘œ C칸으둜 된 ν‘œ λͺ¨μ–‘μ˜ λ³΄λ“œκ°€ μžˆλ‹€. λ³΄λ“œμ˜ 각 μΉΈμ—λŠ” λŒ€λ¬Έμž μ•ŒνŒŒλ²³μ΄ ν•˜λ‚˜μ”© μ ν˜€ 있고, 쒌츑 상단 μΉΈ (1ν–‰ 1μ—΄) μ—λŠ” 말이 놓여 μžˆλ‹€. 말은 μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ λ„€ μΉΈ μ€‘μ˜ ν•œ 칸으

www.acmicpc.net

 

μ ‘κ·Ό

μ²˜μŒμ—” queue λ₯Ό μ‚¬μš©ν•΄ bfs 둜 μ ‘κ·Όν–ˆμ§€λ§Œ, 이 λ¬Έμ œλŠ” dfs 둜만 ν’€ 수 μžˆλ‹€. 

νŒŒλž€μƒ‰μ€ BFS 접근을 λ‚˜νƒ€λ‚΄κ³ , 뢄홍색은 DFS μ‹μ˜ 접근을 λ‚˜νƒ€λ‚Έλ‹€. 

λ¬Έμ œμ—μ„œ κ΅¬ν•˜κ³ μž ν•˜λŠ” 것은 μ΅œλŒ€ν•œ μ–Όλ§ˆλ§ŒνΌ λ»—μ–΄λ‚˜κ°ˆ 수 μžˆλŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” 것이기에, λΆ„ν™μƒ‰μ˜ DFS μ‹μœΌλ‘œ μ ‘κ·Όν•΄μ•Ό 닡을 ꡬ할 수 μžˆλ‹€.

 

 

μ½”λ“œ

r, c = map(int, input().split())
maps = []
for _ in range(r):
    maps.append(list(input()))
ans = 0
alphas = set()
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def dfs(x, y, count):
    global ans
    ans = max(ans, count)
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < r and 0 <= ny < c and not maps[nx][ny] in alphas:
            alphas.add(maps[nx][ny])
            dfs(nx, ny, count+1)
            alphas.remove(maps[nx][ny])
alphas.add(maps[0][0])
dfs(0, 0, 1)
print(ans)

alphas λΌλŠ” set 에 λ°©λ¬Έν•œ λ…Έλ“œμ˜ μ•ŒνŒŒλ²³μ„ λ‹΄λŠ”λ‹€. 리슀트둜 담아도 λ˜κ² μ§€λ§Œ, μ–΄μ°¨ν”Ό μ€‘λ³΅λ˜λŠ” μ›μ†ŒλŠ” ν•„μš”μ—†κΈ°μ— set 으둜 μ„ μ–Έν–ˆλ‹€.

λ…Έλ“œ(ny, nx) κ°€ if 뢄기문에 ν•΄λ‹Ήλœλ‹€λŠ” μ˜λ―ΈλŠ”, μƒˆλ‘­κ²Œ λ…Έλ“œλ₯Ό λ»—μ–΄λ‚˜κ°ˆ 수 μžˆλ‹€λŠ” λœ»μ΄κΈ°μ— count 의 값을 + 1 ν•˜μ—¬ μž¬κ·€ν˜ΈμΆœν•œλ‹€. 

dfs() ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή λ…Έλ“œ(ny, nx) λ₯Ό set μ—μ„œ λΉΌμ€˜μ•Όν•œλ‹€. 

'πŸ”± Algorithm > Back tracking' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

λ°±μ€€ 1174 μ€„μ–΄λ“œλŠ” 수 파이썬  (0) 2022.12.26