๐Ÿงฉ Algorithm/[BOJ] Silver

BOJ 2178๋ฒˆ : ๋ฏธ๋กœ ํƒ์ƒ‰ (Python/Silver 1)

devCloud 2023. 5. 13. 18:36
728x90
 

2178๋ฒˆ: ๋ฏธ๋กœ ํƒ์ƒ‰

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฏธ๋กœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ˆ˜๋“ค์€ ๋ถ™์–ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net


์„ค๋ช…

์œ„ ์‚ฌ์ง„์€ ๋ฏธ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. 1์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์ด๊ณ , 0์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์นธ์ด๋‹ค. Start์นธ์—์„œ End์นธ๊นŒ์ง€ ๊ฐ€์•ผํ•˜๋Š”๋ฐ, ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ์˜ ์นธ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์ฃผํ™ฉ์ƒ‰ ํ˜•๊ด‘์œผ๋กœ ์น ํ•œ ๊ณณ์ด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์นธ ๊ฐœ์ˆ˜๋ฅผ ์„ผ ๊ฒƒ์ด๋‹ค. ์นธ ๊ฐœ์ˆ˜๋ฅผ ์…€ ๋•Œ ์‹œ์ž‘์นธ๊ณผ ๋งˆ์ง€๋ง‰์นธ๋„ ํฌํ•จ๋œ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž!

 

ํ’€์ด

BFS ์ด์šฉ

1. ํŒŒ์ด์ฌ์—์„œ BFS๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํ๋ฅผ ๋งŒ๋“ ๋‹ค.

ํŒŒ์ด์ฌ ๋ฑ ๋ชจ๋“ˆ ๋‚ด์— ์Šคํƒ๊ณผ ํ๊ฐ€ ๋‚ด์žฅ๋ผ ์žˆ์–ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•œ ๋ฑ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ๋‹ค. 

from collections import deque
import sys
input = sys.stdin.readline #์ž…์ถœ๋ ฅ ํ–ฅ์ƒ

2. ๋ฏธ๋กœ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ค‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

N, M = map(int, input().split()) #N = ํ–‰, M = ์—ด
graph = []
for _ in range(N): #ํ–‰
    #์ด์ค‘ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
    graph.append(list(map(int, input().rstrip()))) #rstrip() = ๋งˆ์ง€๋ง‰ ๊ฐœํ–‰ ๋ฌธ์ž ์ œ๊ฑฐ

#๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธ์šฉ์œผ๋กœ ์ถœ๋ ฅ
for i in range(N):
    print(graph[i])

์ถœ๋ ฅ ๊ฒฐ๊ณผ

graph๋ผ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  graph ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. ์ž…๋ ฅ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์ง‘์–ด๋„ฃ๊ณ  ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ graph ๋ฆฌ์ŠคํŠธ์— ๋‹ค์‹œ ์ง‘์–ด๋„ฃ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ฉด(์ถœ๋ ฅ ๊ฒฐ๊ณผ) ๋ฌธ์ œ ์˜ˆ์‹œ์™€ ๋˜‘๊ฐ™์ด ๋ฏธ๋กœ๊ฐ€ ํ‘œํ˜„๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

3. ๋ฏธ๋กœ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜ dx, dy ์ƒ์„ฑ

BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค. (BFS ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•ด๋„ ๋˜์ง€๋งŒ ํŽธ์˜์ƒ ๋จผ์ € ์ •์˜)

๋งŒ์•ฝ 3x3 ๋ฏธ๋กœ(์ขŒ์ธก ๊ทธ๋ฆผ)๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. (0, 0)์—์„œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜„์žฌ์œ„์น˜์—์„œ ์ฃผ๋ณ€์„ ๋‹ค ํ™•์ธํ•ด๋ด์•ผ ํ•˜๋Š”๋ฐ, ๋ฌธ์ œ์—์„œ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ ๋Œ€๊ฐ์„ ์„ ์ œ์™ธํ•œ ์ƒํ•˜์ขŒ์šฐ๋งŒ ํ™•์ธํ•ด๋ณด๋ฉด ๋œ๋‹ค.

ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋ฉด์„œ ํ•ด์•ผ ํ•œ๋‹ค. ์ƒํ•˜์ขŒ์šฐ 4๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ x, y ๋ณ€์ˆ˜์— ๊ฐ ๋„ค ๊ฐœ์˜ ๊ฐ’๋งŒ ๋„ฃ๋Š”๋‹ค. ๋งจ ์šฐ์ธก์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ขŒํ‘œ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ ํ•œ ์นธ์„ ์ด๋™ํ–ˆ์„ ๋•Œ์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ dx์— x์ขŒํ‘œ๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜๋ฏ€๋กœ [(์ขŒ)-1, (์šฐ)1, (์ƒ)0, (ํ•˜)0], ๊ทธ๋ฆฌ๊ณ  dy์—๋Š” y์ขŒํ‘œ์ธ [(์ขŒ)0, (์šฐ)0, (์ƒ)1 (ํ•˜)-1] ์ด๋ ‡๊ฒŒ ์ €์žฅํ•œ๋‹ค. ํ•„์ž๋Š” ์ขŒ์šฐํ•˜์ƒ ์ˆœ๋Œ€๋กœ ์ €์žฅํ–ˆ์ง€๋งŒ, ๋ณธ์ธ์ด ํŽธํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค. (๋‹จ x์™€ y ๋ชจ๋‘ ์ˆœ์„œ์— ๋งž๊ฒŒ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, x๋Š” ์ขŒ์šฐํ•˜์ƒ์ธ๋ฐ y๋Š” ์ขŒ์šฐ์ƒํ•˜ ์ด๋Ÿฐ์‹์œผ๋กœ ์ €์žฅํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.)

#์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋‹ค ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฑธ ์ถ”๊ฐ€ (์•„๋ž˜๋Š” ์ขŒ์šฐ์ƒํ•˜ ์ˆœ๋Œ€๋กœ ์ €์žฅ)
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]

4. BFS ๊ตฌํ˜„

def BFS(x, y):
    q = deque() #๋ฑ ์ƒ์„ฑ
    q.append((x, y)) #์ดˆ๊ธฐ ์œ„์น˜

ํŒŒ์ด์ฌ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด def๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. BFS ํ•จ์ˆ˜ ์ธ์ˆ˜์— ์ขŒํ‘œ๊ฐ’(0, 0)์„ ๋„ฃ์–ด์•ผ ํ•˜๋ฏ€๋กœ x์™€ y๋ฅผ ์“ด๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฑ์„ ์ƒ์„ฑํ•œ๋‹ค. ๋ฑ์˜ ์ด๋ฆ„์€ q๋ผ๊ณ  ์ •์˜ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐ ์œ„์น˜๋ฅผ q์— ๋„ฃ๋Š”๋‹ค.

    while q:
        x, y = q.popleft()  # ๊บผ๋‚ด๊ธฐ

        # ์ขŒ์šฐ์ƒํ•˜์— ๊ธธ์ด ์žˆ๋Š”์ง€ ์ขŒํ‘œ ์ด๋™ํ•˜๋ฉด์„œ ํ™•์ธ
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

์ด์ œ  ์ขŒํ‘œ๋ฅผ ์ด๋™์‹œํ‚ค๋ฉด์„œ ๊ธธ์„ ์ฐพ๋Š”๋‹ค. popleft()๋Š” ๋ฑ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฑธ ๋นผ๋‚ด๊ณ  ์‚ญ์ œํ•œ๋‹ค. ๋ฑ์— ์žˆ๋Š” ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ๊บผ๋‚ด์„œ x, y์— ์ €์žฅํ•œ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ํ˜„์žฌ ์ขŒํ‘œ์—์„œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•œ๋‹ค. 

            # ๋ฏธ๋กœ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ—์–ด๋‚˜๋ฉด ๋ฌด์‹œํ•œ๋‹ค.
            if nx < 0 or nx >= N or ny < 0 or ny >= M:
                continue

๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋กœ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ(3๋ฒˆ)์—์„œ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ (0, 0) ์ผ ๋•Œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•˜๋ฉด Xํ‘œ์‹œ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๊ฑด ๋ฏธ๋กœ ๋ฐ–์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์—†๋‹ค๊ณ  ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏธ๋กœ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋ฌด์‹œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์คฌ๋‹ค. 

            # ๊ธธ(1)์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ์นธ์œผ๋กœ ์ขŒํ‘œ ์ด๋™
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1 #์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์˜ ๊ฐœ์ˆ˜ ์นด์šดํŠธ
                q.append((nx, ny))  # ์ด๋™๋œ nx, ny๋ฅผ queue์— ์ง‘์–ด ๋„ฃ๊ธฐ

์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•˜๋‹ค๊ฐ€ ๊ธธ(1)์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ์นธ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ€ (0, 0)์ผ ๋•Œ graph[0][0]์ด๊ณ  ์ด ๊ฐ’์€ ํ˜„์žฌ 1์ด๋‹ค. ์—ฌ๊ธฐ์— 1์„ ๋”ํ•ด์„œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋™๋œ ์ขŒํ‘œ๋ฅผ ๋‹ค์‹œ ํ์— ๋„ฃ๋Š”๋‹ค. ์ด๋™๋œ ์ขŒํ‘œ๊ฐ€ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋œ๋‹ค.

์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋‹ค ํ™•์ธํ–ˆ์œผ๋ฉด ๋‹ค์‹œ ํ์—์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊บผ๋‚ด์„œ End์นธ์— ๋„์ฐฉํ•  ๋•Œ๊นŒ์ง€ ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.  

return graph[N - 1][M - 1]  # ์ตœ์ข… n, m ์œ„์น˜์—์„œ์˜ graph ๊ฐ’ ์ฆ‰, ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•จ

while๋ฌธ์ด ๋๋‚ฌ์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋™ํ•œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด graph์˜ End์นธ์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค. ์•„๋ž˜์— ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ™•์ธํ•ด๋ณด์ž.

 

Solution (์ „์ฒด ์ฝ”๋“œ)

import sys
input = sys.stdin.readline #์ž…์ถœ๋ ฅ ํ–ฅ์ƒ
from collections import deque

N, M = map(int, input().split())
graph = []
for _ in range(N):
    graph.append(list(map(int, input())))

#์ขŒ์šฐ์ƒํ•˜
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
    
def BFS(x, y):
    q = deque() #ํ ์ƒ์„ฑ
    q.append((x,y)) # x = 0, y = 0 -> deque([(0, 0)])

    while q:
        x, y = q.popleft() # x = 0, y = 0 -> (0, 0)

        for i in range(4): 
            nx = x + dx[i]
            ny = y + dy[i]

            if nx < 0 or nx >= N or ny < 0 or ny >= M:
                continue

            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                q.append((nx, ny))

    return graph[N-1][M-1]

print(BFS(0, 0)) #๊ฒฐ๊ณผ ์ถœ๋ ฅ

โœง 2023-02-19 20:44 -> 23.05.13 ํ’€์ด ์„ค๋ช… ์žฌ์ˆ˜์ •

728x90