๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
4๏ธโƒฃ Python/Problem Solving

[Python Algorithm] ๋ ˆ์ด์ € ํ†ต์‹  BOJ #6087

by seolhee2750 2022. 6. 24.
๋ฌธ์ œ

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

 

6087๋ฒˆ: ๋ ˆ์ด์ € ํ†ต์‹ 

ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„ W×H ํฌ๊ธฐ์˜ ์ง€๋„๊ฐ€ ์žˆ๋‹ค. ์ง€๋„์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ์ด๊ฑฐ๋‚˜ ๋ฒฝ์ด๋ฉฐ, ๋‘ ์นธ์€ 'C'๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ์นธ์ด๋‹ค. 'C'๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๋‘ ์นธ์„ ๋ ˆ์ด์ €๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ

www.acmicpc.net

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import sys
import math

w, h = map(int, sys.stdin.readline().strip().split())
table = []
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
points = [] # 'C'์˜ ์œ„์น˜ (์ฒ˜์Œ ์ž…๋ ฅ๋ฐ›๋Š” ์œ„์น˜๋ฅผ ์‹œ์ž‘์ , ๋‚˜์ค‘์— ์ž…๋ ฅ๋ฐ›๋Š” ์œ„์น˜๋ฅผ ๋„์ฐฉ์ ์œผ๋กœ ์„ค์ •ํ•จ)

for i in range(h):
    now = list(sys.stdin.readline().strip())
    for j in range(w):
        if now[j] == 'C':
            points.append((i, j))
    table.append(now)

def bfs(x, y):
    visited = [[[math.inf] * 4 for _ in range(w)] for _ in range(h)] # ๋ฐฉ๋ฌธ ์ฒดํฌ
    queue = [] # ํƒ์ƒ‰ํ•  ์œ„์น˜์˜ ์ •๋ณด (ํ–‰, ์—ด, ๋ฐฉํ–ฅ)
    idx = 0

    # ๋ณธ๊ฒฉ์ ์œผ๋กœ ํƒ์ƒ‰ ์ „ queue์— ๊ฐ€์žฅ ๋จผ์ € ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์œ„์น˜๋“ค ์ถ”๊ฐ€
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if nx < 0 or ny < 0 or nx >= h or ny >= w or table[nx][ny] == '*':
            continue
        queue.append((nx, ny, i)) # i๊ฐ’์„ ํ†ตํ•ด ๊ทธ ์ „๊นŒ์ง€ ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์˜€๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
        visited[nx][ny][i] = 0

    while idx < len(queue):
        (x, y, direct) = queue[idx]
        idx += 1

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or ny < 0 or nx >= h or ny >= w or table[nx][ny] == '*':
                continue

            cnt = visited[x][y][direct] # ์ด์ „ ์ž๋ฆฌ์˜ ๋ฐฉํ–ฅ ๊ฐ’์„ ํ†ตํ•ด ๊ฑฐ์šธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ •ํ•˜๊ธฐ ์œ„ํ•จ
            if (direct <= 1 and i > 1) or (direct > 1 and i <= 1):
                cnt += 1

            # ๋ฐฉ๋ฌธํ•œ์  ์—†๋Š” ์ž๋ฆฌ์ผ ๊ฒฝ์šฐ, ๊ฑฐ์šธ ๊ฐœ์ˆ˜ ๊ทธ๋Œ€๋กœ ์ €์žฅ / ๋ฐฉ๋ฌธํ•œ์  ์žˆ์„ ๊ฒฝ์šฐ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ 
            if visited[nx][ny][i] == -1:
                visited[nx][ny][i] = cnt
                queue.append((nx, ny, i))
            elif visited[nx][ny][i] > cnt:
                visited[nx][ny][i] = cnt
                queue.append((nx, ny, i))

    # ๋„์ฐฉ ์ง€์ ์— ์ €์žฅ๋œ ๊ฑฐ์šธ ๊ฐœ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜ ๋ฐ˜ํ™˜
    return min(visited[points[1][0]][points[1][1]])

# ์‹œ์ž‘ ์ง€์  ์ขŒํ‘œ ๋„ฃ์–ด์„œ bfs ํ•จ์ˆ˜ ํ˜ธ์ถœ
print(bfs(points[0][0], points[0][1]))

๐Ÿ‘‰ BFS ๋ฌธ์ œ๋กœ, ๊ฐ ์ž๋ฆฌ๋งˆ๋‹ค ๋„ค๋ฐฉํ–ฅ์œผ๋กœ์˜ ๊ฑฐ์šธ ๊ฐœ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

[ ๋ฌธ์ œ ๋ถ„์„ ]

์ขŒํ‘œ๊ฐ’ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํƒ์ƒ‰์ด ํ•„์š”ํ•œ ์ž๋ฆฌ๋ฅผ ์ฐพ๊ณ , queue์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด ๋”์ด์ƒ ํƒ์ƒ‰ํ•  ์ž๋ฆฌ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€
๋ฐ˜๋ณตํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ, ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ†ตํ•ด ํ•„์š”์—†๋Š” ์ค‘๋ณต์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์€ ์ผ๋ฐ˜์ ์ธ BFS ๋ฌธ์ œ๋“ค๊ณผ ๊ฐ™๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์ธ BFS ๋ฌธ์ œ๋“ค๊ณผ ๊ฐ€์žฅ ํฐ ๋‘ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.
(1) ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ•˜๋˜, ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•จ์ด ์•„๋‹ˆ๋ผ ์ ์ ˆํžˆ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด ์ฃผ๊ธฐ ์œ„ํ•จ์ด๋ผ๋Š” ๊ฒƒ
(2) ๋ฐฉ๋ฌธ ์ฒดํฌ ์‹œ True, False๊ฐ€ ์•„๋‹ˆ๋ผ, ๋™์„œ๋‚จ๋ถ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ
์ด๋Ÿฌํ•œ ํŠน์ง•์„ ์ž˜ ์ƒ๊ฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

[ ํ’€์ด ์„ค๋ช… ]

  • ์ฃผ์–ด์ง„ ์ง€๋„ ์ •๋ณด๋ฅผ table ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ด์ฃผ์—ˆ๊ณ , 'C' ๋ฐœ๊ฒฌ ์‹œ ๊ทธ ์ขŒํ‘œ๊ฐ’์„ point ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ–ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ์ด point ๋ฆฌ์ŠคํŠธ๋Š” 'C'์˜ ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
    (bfs ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์‹œ์ž‘์  ์ขŒํ‘œ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๊ณ , bfs ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‹œ์—๋Š” ๋„์ฐฉ์  ์ขŒํ‘œ๋ฅผ ์ด์šฉํ•œ๋‹ค.)
  • bfs ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด visited, queue, idx๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    visited๋Š” ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•จ์ธ๋ฐ, 3์ค‘ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ฐ€์žฅ ๋ง๋‹จ์—๋Š”
    ๋™์„œ๋‚จ๋ถ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ชจ๋“  ๊ฑฐ์šธ์˜ ๊ฐœ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.
    queue๋Š” ์•ž์œผ๋กœ ํƒ์ƒ‰์ด ํ•„์š”ํ•œ ์ขŒํ‘œ๋“ค์— ๋Œ€ํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ–ˆ๊ณ ,
    idx๋Š” queue ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ฉด์„œ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰์„ ๋•๊ธฐ ์œ„ํ•ด ์„ ์–ธํ–ˆ๋‹ค. (deque ์‚ฌ์šฉํ•ด๋„ ok)
  • while์„ ํ†ตํ•ด ๋ณธ๊ฒฉ์ ์œผ๋กœ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, ๊ฐ€์žฅ ๋จผ์ € ํƒ์ƒ‰ํ•  ์ž๋ฆฌ๋“ค์„ queue์— ์ถ”๊ฐ€ํ–ˆ๋‹ค.
    ์‹œ์ž‘์ ์˜ ์—ญํ• ์„ ํ•˜๋Š” 'C'์˜ ๋™์„œ๋‚จ๋ถ์— ์œ„์น˜ํ•˜๋Š” ์ขŒํ‘œ๋“ค์ด ์ด์— ํ•ด๋‹น๋˜๋Š”๋ฐ,
    ์ง€๋„์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๋ฒฝ์ด ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋‘ queue์— ์ถ”๊ฐ€ํ–ˆ๊ณ ,
    ๋ชจ๋“  ๋ฐฉํ–ฅ์—์„œ ์•„์ง ๊ฑฐ์šธ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ visited์—๋Š” 0์„ ์ €์žฅํ–ˆ๋‹ค.
  • while ์•ˆ์—์„œ๋Š” idx ๊ฐ’์— ๋”ฐ๋ผ ํ˜„์žฌ ์ˆœ์„œ์˜ queue ์ธ๋ฑ์Šค๋ฅผ x, y, direct๋กœ ๋ฐ›์•„์™”๋‹ค.
    for๋ฌธ์„ ํ†ตํ•ด 4๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉฐ ํ˜„์žฌ ์ž๋ฆฌ์˜ ๋„ค๊ฐ€์ง€ ๋ฐฉํ–ฅ์„ ๊ณ ๋ คํ•ด์ฃผ์—ˆ๋Š”๋ฐ,
    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง€๋„์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๋ฒฝ์ด ์žˆ์„ ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌํ–ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ƒ๊ฐํ•ด์ฃผ์–ด์•ผ ํ•  ๊ฒƒ์€, ์ƒˆ๋กญ๊ฒŒ ํƒ์ƒ‰์„ ๊ณ ๋ คํ•˜๋Š” ์ขŒํ‘œ(nx, ny)๋กœ ๊ฐ€๋Š” ๋ฐฉํ–ฅ์ด
    ๊ทธ ์ „์— ์ด๋™ํ•˜๋˜ ๋ฐฉํ–ฅ๊ณผ ๊ฐ™์€์ง€, ๋‹ค๋ฅธ์ง€๋ฅผ ํŒ๋‹จํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    ๋‚ด ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ dx, dy ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜๋ฉด visited[x][y][direct]์—์„œ direct ์ธ๋ฑ์Šค๊ฐ€
    0, 1์ผ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜์ง์œผ๋กœ ์ด๋™, 2, 3์ผ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜ํ‰์œผ๋กœ ์ด๋™ํ–ˆ์™”์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    => direct๊ฐ€ 1์ดํ•˜์ด๋ฉฐ i๊ฐ€ 2 ์ด์ƒ์ผ ๊ฒฝ์šฐ, ํ˜น์€ direct๊ฐ€ 2์ด์ƒ์ด๋ฉฐ i๊ฐ€ 1 ์ดํ•˜์ผ ๊ฒฝ์šฐ์—๋Š”
    ๊ทธ ์ „๊ณผ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, cnt๋ฅผ 1 ํ‚ค์›Œ์ค€๋‹ค. (๊ฑฐ์šธ ์ถ”๊ฐ€)
  • ๊ทธ๋ฆฌ๊ณ  visited์˜ ํ•ด๋‹น ์ธ๋ฑ์Šค์— -1์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ์ž๋ฆฌ์ด๋ฏ€๋กœ cnt๋ฅผ ๊ทธ๋Œ€๋กœ ์ถ”๊ฐ€,
    ํ•ด๋‹น ์ธ๋ฑ์Šค์— cnt๋ณด๋‹ค ํฐ ๊ฐ’์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด ํ˜„์žฌ์˜ cnt ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•ด์ฃผ์—ˆ๋‹ค.
    (๊ฑฐ์šธ์„ ์ตœ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ฏ€๋กœ ๊ณ„์†ํ•˜์—ฌ ์ตœ์†Ÿ๊ฐ‘์œผ๋กœ ๊ฐฑ์‹ )
  • queue์— ์žˆ๋Š” ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ–ˆ๋‹ค๋ฉด ๋„์ฐฉ ์ง€์  ์ขŒํ‘œ์˜ visited ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์˜ˆ์™ธ๋„ ๊ต‰์žฅํžˆ ๋งŽ๊ณ  ๊ณ ๋ คํ•ด์ค„ ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ์•„์ฃผ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ๋ฌธ์ œ๋‹ค.
    ๊ทธ๋ž˜๋„ ๋•๋ถ„์— BFS๋ฅผ ๋” ์ž˜ ์•Œ๊ฒŒ ๋œ ๋“ฏ

๋Œ“๊ธ€