[Baekjoon/πŸ₯‡β…’] 2206: λ²½ λΆ€μˆ˜κ³  μ΄λ™ν•˜κΈ°β­οΈ

3 λΆ„ μ†Œμš”

πŸ™‹β€β™€οΈ λ²½ λΆ€μˆ˜κ³  μ΄λ™ν•˜κΈ°

NΓ—M의 ν–‰λ ¬λ‘œ ν‘œν˜„λ˜λŠ” 맡이 μžˆλ‹€. λ§΅μ—μ„œ 0은 이동할 수 μžˆλŠ” 곳을 λ‚˜νƒ€λ‚΄κ³ , 1은 이동할 수 μ—†λŠ” 벽이 μžˆλŠ” 곳을 λ‚˜νƒ€λ‚Έλ‹€. 당신은 (1, 1)μ—μ„œ (N, M)의 μœ„μΉ˜κΉŒμ§€ μ΄λ™ν•˜λ € ν•˜λŠ”λ°, μ΄λ•Œ μ΅œλ‹¨ 경둜둜 μ΄λ™ν•˜λ € ν•œλ‹€. μ΅œλ‹¨κ²½λ‘œλŠ” λ§΅μ—μ„œ κ°€μž₯ 적은 개수의 칸을 μ§€λ‚˜λŠ” 경둜λ₯Ό λ§ν•˜λŠ”λ°, μ΄λ•Œ μ‹œμž‘ν•˜λŠ” μΉΈκ³Ό λλ‚˜λŠ” 칸도 ν¬ν•¨ν•΄μ„œ μ„Όλ‹€.

λ§Œμ•½μ— μ΄λ™ν•˜λŠ” 도쀑에 ν•œ 개의 벽을 λΆ€μˆ˜κ³  μ΄λ™ν•˜λŠ” 것이 μ’€ 더 κ²½λ‘œκ°€ 짧아진닀면, 벽을 ν•œ 개 κΉŒμ§€ λΆ€μˆ˜κ³  μ΄λ™ν•˜μ—¬λ„ λœλ‹€.

ν•œ μΉΈμ—μ„œ 이동할 수 μžˆλŠ” 칸은 μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ 칸이닀.

맡이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μ΅œλ‹¨ 경둜λ₯Ό ꡬ해 λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ™‹β€β™€οΈ μž…λ ₯

첫째 쀄에 N(1 ≀ N ≀ 1,000), M(1 ≀ M ≀ 1,000)이 주어진닀. λ‹€μŒ N개의 쀄에 M개의 숫자둜 맡이 주어진닀. (1, 1)κ³Ό (N, M)은 항상 0이라고 κ°€μ •ν•˜μž.

πŸ™‹β€β™€οΈ 좜λ ₯

첫째 쀄에 μ΅œλ‹¨ 거리λ₯Ό 좜λ ₯ν•œλ‹€. λΆˆκ°€λŠ₯ν•  λ•ŒλŠ” -1을 좜λ ₯ν•œλ‹€.


πŸ‘©β€πŸ’» μ–΄λ–»κ²Œ ν’€μ–΄λ‚˜κ°ˆκΉŒ?

μš°μ„  κ·Έλž˜ν”„ 탐색, μ΅œλ‹¨κ±°λ¦¬ 문제이기 λ•Œλ¬Έμ— bfsλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

ν•΄λ‹Ή λ¬Έμ œλŠ” 일반 bfs λ¬Έμ œμ—μ„œ 쑰건이 μΆ”κ°€λœ λ¬Έμ œμ΄λ‹€.

λ§Œμ•½μ— μ΄λ™ν•˜λŠ” 도쀑에 ν•œ 개의 벽을 λΆ€μˆ˜κ³  μ΄λ™ν•˜λŠ” 것이 μ’€ 더 κ²½λ‘œκ°€ 짧아진닀면, 벽을 ν•œ 개 κΉŒμ§€ λΆ€μˆ˜κ³  μ΄λ™ν•˜μ—¬λ„ λœλ‹€.

μ²˜μŒμ—λŠ” 벽의 μ’Œν‘œλ₯Ό λͺ¨λ‘ 기둝해 각각의 κ²½μš°μ—μ„œ λš«μ—ˆμ„ λ•Œ bfs λ°˜λ³΅ν•΄μ„œ ν˜ΈμΆœν•˜μ˜€λ‹€. λ‹Ήμ—°νžˆ κ²°κ³ΌλŠ” μ‹œκ°„μ΄ˆκ³Όμ˜€λ‹€!

κ°„λ‹¨ν•œ 쑰건 ν•˜λ‚˜λ§Œ μΆ”κ°€λœ 것인데 κ΅¬ν˜„μ— κ½€ μ• λ₯Ό λ¨Ήμ—ˆλ‹€.


단 ν•œ 번의 bfs ν˜ΈμΆœμ„ 톡해 벽을 λΆ€μˆ˜λŠ” κ²½μš°κΉŒμ§€ μ²˜λ¦¬ν•˜λŠ” 방식은 비ꡐ적 κ°„λ‹¨ν–ˆλ‹€. λ‹¨μˆœνžˆ 벽을 λΆ€μˆœ μ—¬λΆ€λ₯Ό κΈ°λ‘ν•˜λ©΄ λœλ‹€.

벽을 1λ²ˆμ΄λΌλ„ λΆ€μˆœ κ²½μš°μ—λŠ” 이후 벽을 λ§Œλ‚¬μ„ λ–„ κ²½λ‘œκ°€ λ§‰νžˆκ²Œ λœλ‹€. ν•˜μ§€λ§Œ 벽을 ν•œ λ²ˆλ„ λΆ€μˆ˜μ§€ μ•Šμ€ 경우, 이후 벽을 λ§Œλ‚¬μ„ λ•Œ ν•΄λ‹Ή 경둜λ₯Ό 뚫고 bfsλ₯Ό μ§„ν–‰ν•˜λ©΄ λœλ‹€!

κ·Έλ ‡λ‹€λ©΄ κ·Έ μ½”λ“œλ₯Ό μ•„λž˜μ—μ„œ ν™•μΈν•΄λ³΄μž!!


πŸ‘©β€πŸ’» Code: μ˜€λ‹΅

import sys
from collections import deque
INF = sys.maxsize

def bfs():
    global answer
    q = deque([(1, 0, 0, False)])
    visited = [[0]*m for _ in range(n)]
    visited[0][0] = 1

    while q:
        dis, x, y, check = q.popleft()

        if x == n-1 and y == m-1:
            answer = min(dis, answer)

        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            if 0<=nx<n and 0<=ny<m:
                if graph[nx][ny] == "0": # 벽이 아닐 경우
                    if visited[nx][ny] == 0:
                        visited[nx][ny] = 1
                        q.append((dis+1, nx, ny, check))
                else: # 벽일 경우
                    if check == False:
                        q.append((dis+1, nx, ny, True))
    
    return answer

n, m = map(int, sys.stdin.readline().split())
graph = [list(sys.stdin.readline().rstrip()) for _ in range(n)]
walls = []

dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]

answer = INF
bfs()
if answer == INF:
    print(-1)
else:
    print(answer)

ν•˜μ§€λ§Œ ν•΄λ‹Ή μ½”λ“œλŠ” 제λͺ©μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μ˜€λ‹΅μΈ μ½”λ“œμ΄λ‹€!

λ„λŒ€μ²΄ μ™œ????🫠

μ–΄λŠ λΆ€λΆ„μ—μ„œ μ˜ˆμ™Έ 처리λ₯Ό ν•˜μ§€ λͺ»ν–ˆμ„κΉŒ 계속 κ³ λ―Όν•˜λ˜ 쀑, λ‹€λ₯Έ 뢄이 ν•œ 질문 덕뢄에 원인을 찾을 수 μžˆμ—ˆλ‹€..γ…Žγ…Ž


πŸ‘©β€πŸ’» Code1: μ˜ˆμ™Έ μΌ€μ΄μŠ€

μœ„ μ½”λ“œλŠ” λ‹€μŒμ˜ μ˜ˆμ™Έ μΌ€μ΄μŠ€λ₯Ό 가진닀.

4 6
010100
010110
000110
111110
  • (0,1)μ—μ„œ 벽을 λΆ€μˆ˜κ³  κ°„ 경우
    • (0, 2)λŠ” 방문처리 λœλ‹€.
    • (0, 3)μ—μ„œ λ‹€μ‹œ 벽을 λ§Œλ‚˜ 경둜λ₯Ό λ§ˆλ¬΄λ¦¬ν•˜κ²Œ λœλ‹€.
  • (0, 1)μ—μ„œ 벽을 λΆ€μˆ˜μ§€ μ•Šμ€ 경우
    • U자 ν˜•νƒœλ‘œ 돌고 λŒμ•„ (0, 2)λ₯Ό λ°©λ¬Έν•˜κ²Œ λœλ‹€.
    • ν•˜μ§€λ§Œ λ°©λ¬Έ μ²˜λ¦¬κ°€ 이미 λ˜μ–΄ μžˆμœΌλ―€λ‘œ 경둜λ₯Ό λ§ˆλ¬΄λ¦¬ν•œλ‹€.⭐️

즉, 벽을 λΆ€μˆœ κ²½μš°μ™€ λΆ€μˆ˜μ§€ μ•Šμ€ 경우λ₯Ό 뢄리해 λ°©λ¬Έ 기둝을 μ €μž₯ν•΄μ•Ό ν•œλ‹€. κ·Έ μ΄μœ λŠ” λ‹¨μˆœν•˜λ‹€!


벽을 λΆ€μˆœ κ²½μš°μ™€ λΆ€μˆ˜μ§€ μ•Šμ€ 경우의 κ²½λ‘œκ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.

  • 벽을 λΆ€μˆœ μƒνƒœμ—μ„œ (0,2)에 λ„μ°©ν•œ 경우, (0,3)μ—μ„œ 벽을 λ§Œλ‚˜ 경둜λ₯Ό λ§ˆλ¬΄λ¦¬ν•œλ‹€.
  • 벽을 λΆ€μˆ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ (0, 2)에 λ„μ°©ν•œ 경우, (0, 3)μ—μ„œ 벽을 λ§Œλ‚˜λ”λΌλ„ 벽을 λΆ€μˆ˜κ³  λ‚˜μ•„κ°ˆ 수 μžˆλ‹€.

이제 이λ₯Ό μ μš©ν•œ μ½”λ“œλ₯Ό ν™•μΈν•΄λ³΄μž!


πŸ‘©β€πŸ’» Code: μ •λ‹΅

import sys
from collections import deque
INF = sys.maxsize

def bfs():
    global answer
    q = deque([(1, 0, 0, False)])
    # λ°©λ¬Έ 기둝을 뢄리!
    visited1 = [[0]*m for _ in range(n)]
    visited2 = [[0]*m for _ in range(n)]
    visited1[0][0] = 1

    while q:
        dis, x, y, check = q.popleft()

        if x == n-1 and y == m-1:
            return dis

        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            if 0<=nx<n and 0<=ny<m:
                if graph[nx][ny] == "0": # 벽이 아닐 경우
                    if not check: # 벽을 ν—ˆλ¬Όμ§€ μ•Šκ³  μ§€λ‚˜κ°€λŠ” 경우
                        if visited1[nx][ny] == 0:
                            visited1[nx][ny] = 1
                            q.append((dis+1, nx, ny, check))
                    else: # 벽을 ν—ˆλ¬Όκ³  μ§€λ‚˜κ°€λŠ” 경우
                        if visited2[nx][ny] == 0:
                            visited2[nx][ny] = 1
                            q.append((dis+1, nx, ny, check))
                else: # 벽일 경우
                    if check == False:
                        q.append((dis+1, nx, ny, True))
    
    return -1

n, m = map(int, sys.stdin.readline().split())
graph = [list(sys.stdin.readline().rstrip()) for _ in range(n)]
walls = []

dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]

print(bfs())

bfs 문제라고 λ‹€ λ˜‘κ°™μ€ λ¬Έμ œλŠ” μ•„λ‹ˆκ΅¬λ‚˜λ₯Ό ν™•μ‹€νžˆ λŠλ‚€ λ¬Έμ œμ˜€λ‹€. λ‹€λ₯Έ 쑰건이 뢙은 bfs λ¬Έμ œλ„ ν•΄λ‹Ή 문제 풀이λ₯Ό μ°Έκ³ ν•΄ 잘 ν’€μ–΄λ‚˜κ°ˆ 수 μžˆμ„ 것 같은 λŠλ‚Œ~

πŸ“ μ°Έκ³  자료

λŒ“κΈ€λ‚¨κΈ°κΈ°