ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

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

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

www.acmicpc.net

 

문제 풀이

 κ·Έλž˜ν”„λ₯Ό 상, ν•˜, 쒌, 우둜 νƒμƒ‰ν•˜λŠ”λ° μ•ŒνŒŒλ²³μ΄ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” ν•œ 이동할 수 μžˆλ‹€. μ΄λ•Œ μ΅œλŒ€λ‘œ 이동할 수 μžˆλŠ” 거리λ₯Ό κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€. μ²˜μŒμ—λŠ” 각 κ²½μš°μ— λŒ€ν•΄ λͺ¨λ‘ νƒμƒ‰ν•˜μ—¬μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ—¬ λ°±νŠΈλž™ν‚Ήμ„ μƒκ°ν•˜λ‘œ DFS둜 μž‘μ„±ν•˜μ˜€λŠ”λ°, νŒŒμ΄μ¬μœΌλ‘œλŠ” 톡과할 수 μ—†μ—ˆλ‹€. λ”°λΌμ„œ BFS둜 ν’€μ—ˆλŠ”λ° BFS μ—­μ‹œ `deque`λ₯Ό μ‚¬μš©ν•˜λ‹ˆ λ©”λͺ¨λ¦¬ μ΄ˆκ³Όκ°€ λ°œμƒν•˜μ—¬ 문제λ₯Ό ν’€ 수 μ—†μ—ˆλ‹€.

 λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 풀이λ₯Ό μ°Έκ³ ν•˜λ‹ˆ, 큐 μ•ˆμ— μ€‘λ³΅λ˜λŠ” μ›μ†Œκ°€ μ—†μœΌλ―€λ‘œ `deque`, `list`보닀 속도가 λΉ λ₯Έ `set`을 ν™œμš©ν•˜μ—¬ 큐처럼 ν™œμš©ν•˜λ‹ˆ λ©”λͺ¨λ¦¬ λ¬Έμ œμ™€ 속도 문제λ₯Ό ν•΄κ²° ν•  수 μžˆλŠ” 것 κ°™μ•˜λ‹€. μ΄μ „μ—λŠ” λ°±νŠΈλž™ν‚Ήμ˜ 경우, DFSκ°€ νŽΈν•œλ‹€κ³  μƒκ°€ν•˜μ˜€λŠ”λ° BFS의 경우 ν•„μš”ν•œ κ°€μ§€λ§Œ μ΅œμ’…μ μœΌλ‘œ 뻣게 λ˜λ―€λ‘œ, κ²½μš°μ— 따라 νš¨μœ¨μ μ΄λΌλŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€.

 

μ½”λ“œ

from sys import stdin


def visitable(x, y, alphabets):
    return 0 <= x < r and 0 <= y < c and graph[x][y] not in alphabets


def bfs(start):
    global answer
    q = set([start])
    dirs = ((0, 1), (0, -1), (1, 0), (-1, 0))

    while q:
        cur_x, cur_y, alphabets = q.pop()

        for x, y in dirs:
            next_x, next_y = cur_x + x, cur_y + y
            if visitable(next_x, next_y, alphabets):
                q.add((next_x, next_y, alphabets + graph[next_x][next_y]))
                answer = max(answer, len(alphabets) + 1)


if __name__ == '__main__':
    answer = 1
    r, c = map(int, stdin.readline().split())
    graph = [list(stdin.readline().strip()) for _ in range(r)]
    bfs((0, 0, graph[0][0]))
    print(answer)
728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€