ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

1261๋ฒˆ: ์•Œ๊ณ ์ŠคํŒŸ

์ฒซ์งธ ์ค„์— ๋ฏธ๋กœ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€๋กœ ํฌ๊ธฐ M, ์„ธ๋กœ ํฌ๊ธฐ N (1 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋ฏธ๋กœ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž 0๊ณผ 1์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ๋ฐฉ์„ ์˜๋ฏธํ•˜๊ณ , 1์€ ๋ฒฝ์„ ์˜๋ฏธ

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ์ฃผ์–ด์ง„ ๋ฏธ๋กœ์—๋Š” 2๊ฐ€์ง€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์ด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ๋ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฒฝ์„ ์ตœ์†Œํ•œ์œผ๋กœ ๋ถ€์ˆ˜๊ณ , [N, M]์— ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ 2๊ฐœ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐ€์ค‘์น˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ํ’€์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ์—์„œ๋Š” ๋ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฃผ๋ฉด ๋˜๋ฏ€๋กœ ์ด์ „์— ํ‘ผ ์ˆจ๋ฐ”๊ผญ์งˆ 3๊ณผ ๊ฐ™์ด BFS๋ฅผ ํ†ตํ•ด์„œ๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

 ์•„๋ž˜์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ ์ค‘ ๋ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ (0)์ด๋ฉด `appendleft`๋กœ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ์ด์™€ ๋ฐ˜๋Œ€๋กœ ๋ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฉด `append`๋กœ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • `deque`์—์„œ ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ `popleft`๋ฅผ ํ†ตํ•ด ๊บผ๋‚ด๊ฒŒ ๋˜๋ฏ€๋กœ `appendleft`๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • `visited`๋ฅผ ๋‹จ์ˆœํžˆ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ , ๋ฒฝ์ด ์žˆ๋‹ค๋ฉด ์ด์ „์— ๋ถ€์ˆœ ๋ฒฝ์˜ ์ˆ˜์— + 1์„ ํ•ด์ค€๋‹ค.
  • ์ด์™€ ๋ฐ˜๋Œ€๋กœ ๋ฒฝ์ด ์—†๋‹ค๋ฉด, ์ด์ „์— ๋ถ€์ˆœ ๋ฒฝ์˜ ์ˆ˜๋งŒ ๋ฐ˜์˜ํ•œ๋‹ค.

 

์ฝ”๋“œ

from sys import stdin
from collections import deque


def visitable(x, y):
    return 0 <= x < m and 0 <= y < n and graph[x][y] > -1


def bfs(start):
    q = deque([start])

    while q:
        cur_x, cur_y = q.popleft()

        for x, y in dirs:
            next_x, next_y = cur_x + x, cur_y + y

            if visitable(next_x, next_y):
                visited[next_x][next_y] = visited[cur_x][cur_y]

                if not graph[next_x][next_y]:
                    q.appendleft([next_x, next_y])
                else:
                    visited[next_x][next_y] += 1
                    q.append([next_x, next_y])
                graph[next_x][next_y] = -1

    return visited[m - 1][n - 1]


if __name__ == '__main__':
    n, m = map(int, stdin.readline().split())
    graph = [list(map(int, stdin.readline().rstrip())) for _ in range(m)]
    visited = [[0] * n for _ in range(m)]
    dirs = ((0, 1), (0, -1), (1, 0), (-1, 0))

    graph[0][0] = -1
    print(bfs([0, 0]))
728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€