๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

๋ฐฑ์ค€ 2206 | ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ [ํŒŒ์ด์ฌ]

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

 

 

ํ’€์ด

์ฒ˜์Œ์— 14502๋ฒˆ - ์—ฐ๊ตฌ์†Œ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋งต(๊ทธ๋ž˜ํ”„)์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋Œ๋ฉด์„œ ๋ฒฝ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  bfs ๋Œ๋ ค๋ณด๊ณ  ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋‹ค์‹œ ๊ทธ ์ž๋ฆฌ์— ๋ฒฝ์„ ์„ธ์šฐ๊ณ  ๋‹ค๋ฅธ ๋ฒฝ์„ ๋ถ€์ˆ˜์–ด๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์ฝ”๋“œ๋ฅผ ์งฐ๋Š”๋ฐ, ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ฐ€ ๋‚˜์™”๊ณ  ๋‘ ๋ฒˆ์งธ ์‹œ๋„์—๋Š” ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค ๊ฐ€ ๋‚˜์™”๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๋„ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ํ’€์ด ๋ฐฉ๋ฒ•์„ ๋ณด์•˜๊ณ  ๋˜, 2206๋ฒˆ ๋ฌธ์ œ FAQ ๊ธ€์ด ์žˆ๊ธธ๋ž˜ ๋ดค๋Š”๋ฐ...

 

์ผ๋‹จ ์ด ํ•ด๊ฒฐ ๋ฐฉ์‹์€ ์ •๋‹ต์ด ๋  ์ˆ˜ ์—†๋‹ค. ์ด์œ ๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์—ฐ๊ตฌ์†Œ ๋ฌธ์ œ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” N, M ๋ฒ”์œ„๊ฐ€ ์ž‘์•„์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฐฉ๋ฌธํ•ด๋„ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ํฌ์ง€ ์•Š์•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” N, M์˜ ๋ฒ”์œ„๊ฐ€ 1,000์ด๋ผ์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋„ 1000 * 1000 ์ด๋ผ๋Š” ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
๋‘ ๋ฒˆ์งธ๋Š” (N, M)์œผ๋กœ ๊ฐ€๋Š” ๊ธธ๋ชฉ์ด ๋ฒฝ์œผ๋กœ ๋ง‰ํ˜€์žˆ๋Š” ์ƒํ™ฉ์—์„œ ๊ทธ ๋ฒฝ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฒฝ์„ ๋ถ€์ˆœ ๊ฒฝ์šฐ์™€ ๋ถ€์ˆ˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‘˜ ์ค‘ ๋ถ€์ˆœ ๊ฒฝ์šฐ๊ฐ€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ผ ๋•Œ, ์ด๋ฏธ ๋ฒฝ์„ ํ•œ ๋ฒˆ ๋ถ€์‰ˆ๊ธฐ ๋•Œ๋ฌธ์— (N, M)์œผ๋กœ ๊ฐˆ ์ˆ˜๊ฐ€ ์—†์–ด -1์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ํ˜„์žฌ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์ง€๊ธˆ ๋‹น์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ์•„๋‹์ง€๋ผ๋„ (N, M)์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๋ผ๋ฉด ๊ทธ ๊ฒฝ๋กœ๊ฐ€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ฒ˜์Œ ์ƒ๊ฐํ•ด๋‚ธ ๋ฐฉ๋ฒ•์€ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์ด ๋  ์ˆ˜ ์—†์—ˆ๋‹ค.

 

๊ทธ๋Ÿผ, ์ด์ œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ์ •๋‹ต์„ ์ฐพ์•„๋ณด์ž. ๋จผ์ € ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์ ์ธ ๋ชจ๋“  ์š”์†Œ์˜ ๋ฒฝ์„ ํ—ˆ๋ฌผ์–ด๋ณธ๋‹ค๋Š” ๋ฌด์ž‘์ • ํ—ˆ๋ฌผ๊ณ  bfs๋ฅผ ๋Œ๋ ค๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹Œ bfs๋ฅผ ๋จผ์ € ๋Œ๋ ค๋ณด๊ณ  ๊ทธ ๊ณผ์ •์—์„œ ๊ฐ€๋Š” ๊ฒฝ๋กœ์— ๋ฒฝ์ด ์žˆ๊ณ , ์ด ๊ฒฝ๋กœ๋Š” ๋ฒฝ์„ ํ—ˆ๋ฌธ ์ ์ด ์—†๋‹ค๋ฉด ํ—ˆ๋ฌผ์–ด๋ณด์ž ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋งต(๊ทธ๋ž˜ํ”„) ๊ฐ๊ฐ์˜ ์š”์†Œ์— ๊ฒฝ๋กœ์— ๋”ฐ๋ผ "๋ฒฝ์„ ํ—ˆ๋ฌผ์—ˆ๋‚˜?" ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๊ณง ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋กœ ์ด์–ด์ง„๋‹ค. ์™œ๋ƒํ•˜๋ฉด (N, M) ์ง€์ ์ด ๋ฒฝ์œผ๋กœ ๋‘˜๋Ÿฌ์ ธ์žˆ์„ ๋•Œ (N, M) ์ง€์  ์•ž ๋ฒฝ๊นŒ์ง€ ์–ด๋–ค ๋ฒฝ์„ ํ—ˆ๋ฌผ๊ณ  ์˜จ ๊ฒฝ๋กœ์™€ ํ—ˆ๋ฌผ์ง€ ์•Š๊ณ  ์˜จ ๊ฒฝ๋กœ ์ค‘ ํ—ˆ๋ฌธ ๊ฒฝ๋กœ๊ฐ€ ๋” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ผ๋ฉด ์ด ๊ฒฝ๋กœ์˜ ๊ฐ๊ฐ์˜ ๊ธธ์€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ๊ธฐ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ—ˆ๋ฌผ์ง€ ์•Š์€ ๊ฒฝ๋กœ๊ฐ€ ์žฌ๋ฐฉ๋ฌธ์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ์ฆ‰, (N, M) ์ง€์ ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๋ฒฝ์„ ํ—ˆ๋ฌธ ๊ฒฝ์šฐ์™€ ํ—ˆ๋ฌผ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‘˜๋กœ ๋‚˜๋ˆ„์–ด ์ฃผ๋ฉด ๋œ๋‹ค! ๊ทธ๋Ÿฌ๋ฉด ๋ฒฝ์„ ํ—ˆ๋ฌธ ๊ฒฝ์šฐ์— ๋จผ์ € ๋ฐฉ๋ฌธํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹คํ•ด๋„ ํ—ˆ๋ฌผ์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋’ค๋Šฆ๊ฒŒ ๋ฐฉ๋ฌธํ•˜์—ฌ (N, M) ์ง€์ ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด, bfs ํƒ์ƒ‰์„ ๋Œ๋ฆฌ๋ฉด์„œ ๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ์— ๋ฒฝ์„ ํ—ˆ๋ฌผ๊ณ  ๊ฐ€๋Š” ๊ฒฝ๋กœ์ธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ๊ฒฝ๋กœ์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ—ˆ๋ฌผ๊ณ  ๊ฐ€๋Š” ๊ฒฝ์šฐ์ธ์ง€ ํ—ˆ๋ฌผ์ง€ ์•Š๊ณ  ๊ฐ€๋Š” ๊ฒฝ์šฐ์ธ์ง€ ๋‚˜๋ˆ„์–ด ํ‘œ์‹œํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณผ์ •์—์„œ (N, M) ์ง€์ ์œผ๋กœ ๋จผ์ € ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค.

 

 

์ฝ”๋“œ

import sys, copy
from collections import deque
input = sys.stdin.readline

N, M = map(int, input().split())
path = [list(map(int, input().rstrip())) for _ in range(N)]
visited =[[[0, 0] for i in range(M)] for _ in range(N)]
wasd = ((0, -1), (0, 1), (-1, 0), (1, 0))

def bfs(start_x, start_y):
    queue = deque()
    queue.append([start_x, start_y, 0])

    visited[start_y][start_x][0] = True
    dist = copy.deepcopy(path)
    dist[start_y][start_x] = 1

    while queue:
        x, y, wall_break = queue.popleft()
        
        if x == M-1 and y == N-1:
            return dist[y][x]

        for xx, yy in wasd:
            xx += x
            yy += y

            if (0 <= xx < M) and (0 <= yy < N):
                if path[yy][xx] == 0:
                    if not visited[yy][xx][wall_break]:
                        queue.append([xx, yy, wall_break])
                        visited[yy][xx][wall_break] = True
                        dist[yy][xx] = dist[y][x] + 1
                elif path[yy][xx] == 1 and wall_break == 0:
                    if not visited[yy][xx][0]:
                        queue.append([xx, yy, wall_break + 1])
                        visited[yy][xx][0] = True
                        dist[yy][xx] = dist[y][x] + 1
    
    return -1

print(bfs(0, 0))