๐Ÿ“š Study/Baekjoon

[Gold IV] 3055 - ํƒˆ์ถœ

์œฐ๊ฐฑ 2025. 4. 15. 13:56

๋ฌธ์ œ

์‚ฌ์•…ํ•œ ์•”ํ‘์˜ ๊ตฐ์ฃผ ์ด๋ฏผํ˜์€ ๋“œ๋””์–ด ๋งˆ๋ฒ• ๊ตฌ์Šฌ์„ ์†์— ๋„ฃ์—ˆ๊ณ , ๊ทธ ๋Šฅ๋ ฅ์„ ์‹คํ—˜ํ•ด๋ณด๊ธฐ ์œ„ํ•ด ๊ทผ์ฒ˜์˜ ํ‹ฐ๋–ฑ์ˆฒ์— ํ™์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ด ์ˆฒ์—๋Š” ๊ณ ์Šด๋„์น˜๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์‚ด๊ณ  ์žˆ๋‹ค. ๊ณ ์Šด๋„์น˜๋Š” ์ œ์ผ ์นœํ•œ ์นœ๊ตฌ์ธ ๋น„๋ฒ„์˜ ๊ตด๋กœ ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ๋„๋ง๊ฐ€ ํ™์ˆ˜๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

ํ‹ฐ๋–ฑ์ˆฒ์˜ ์ง€๋„๋Š” Rํ–‰ C์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋น„์–ด์žˆ๋Š” ๊ณณ์€ '.'๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๊ณ , ๋ฌผ์ด ์ฐจ์žˆ๋Š” ์ง€์—ญ์€ '*', ๋Œ์€ 'X'๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ๋น„๋ฒ„์˜ ๊ตด์€ 'D'๋กœ, ๊ณ ์Šด๋„์น˜์˜ ์œ„์น˜๋Š” 'S'๋กœ ๋‚˜ํƒ€๋‚ด์–ด์ ธ ์žˆ๋‹ค.

๋งค ๋ถ„๋งˆ๋‹ค ๊ณ ์Šด๋„์น˜๋Š” ํ˜„์žฌ ์žˆ๋Š” ์นธ๊ณผ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. (์œ„, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ, ์™ผ์ชฝ) ๋ฌผ๋„ ๋งค ๋ถ„๋งˆ๋‹ค ๋น„์–ด์žˆ๋Š” ์นธ์œผ๋กœ ํ™•์žฅํ•œ๋‹ค. ๋ฌผ์ด ์žˆ๋Š” ์นธ๊ณผ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋น„์–ด์žˆ๋Š” ์นธ(์ ์–ด๋„ ํ•œ ๋ณ€์„ ๊ณต์œ )์€ ๋ฌผ์ด ์ฐจ๊ฒŒ ๋œ๋‹ค. ๋ฌผ๊ณผ ๊ณ ์Šด๋„์น˜๋Š” ๋Œ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋‹ค. ๋˜, ๊ณ ์Šด๋„์น˜๋Š” ๋ฌผ๋กœ ์ฐจ์žˆ๋Š” ๊ตฌ์—ญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๊ณ , ๋ฌผ๋„ ๋น„๋ฒ„์˜ ์†Œ๊ตด๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.

ํ‹ฐ๋–ฑ์ˆฒ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ณ ์Šด๋„์น˜๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ๋น„๋ฒ„์˜ ๊ตด๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๊ณ ์Šด๋„์น˜๋Š” ๋ฌผ์ด ์ฐฐ ์˜ˆ์ •์ธ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋‹ค์Œ ์‹œ๊ฐ„์— ๋ฌผ์ด ์ฐฐ ์˜ˆ์ •์ธ ์นธ์œผ๋กœ ๊ณ ์Šด๋„์น˜๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ณ ์Šด๋„์น˜๊ฐ€ ๋ฌผ์— ๋น ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋‹ค์Œ R๊ฐœ ์ค„์—๋Š” ํ‹ฐ๋–ฑ์ˆฒ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ ๋ฌธ์ž๋งŒ ์ฃผ์–ด์ง„๋‹ค. 'D'์™€ 'S'๋Š” ํ•˜๋‚˜์”ฉ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊ณ ์Šด๋„์น˜๊ฐ€ ๋น„๋ฒ„์˜ ๊ตด๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ์•ˆ์ „ํ•˜๊ฒŒ ๋น„๋ฒ„์˜ ๊ตด๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, "KAKTUS"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

3 3
D.*
...
.S.

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

3

์˜ˆ์ œ ์ž…๋ ฅ 2 ๋ณต์‚ฌ

3 3
D.*
...
..S

์˜ˆ์ œ ์ถœ๋ ฅ 2 ๋ณต์‚ฌ

KAKTUS

์˜ˆ์ œ ์ž…๋ ฅ 3 ๋ณต์‚ฌ

3 6
D...*.
.X.X..
....S.

์˜ˆ์ œ ์ถœ๋ ฅ 3 ๋ณต์‚ฌ

6

์˜ˆ์ œ ์ž…๋ ฅ 4 ๋ณต์‚ฌ

5 4
.D.*
....
..X.
S.*.
....

์˜ˆ์ œ ์ถœ๋ ฅ 4 ๋ณต์‚ฌ

4

# ํ’€์ด ๋ฐฉ๋ฒ•

๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ๋ฌผ์–ด๋ดค๊ธฐ ๋•Œ๋ฌธ์— bfs๋กœ ์ ‘๊ทผํ–ˆ๋‹ค.

(1) ๋ฌผ ํ™•์žฅ (2) ๊ณ ์Šด๋„์น˜์˜ ์ด๋™ < ์ด ๊ตฌ์กฐ๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š”๊ฑด ์–ด๋ ต์ง€ ์•Š์•˜๋Š”๋ฐ

(2) ์—์„œ queue๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Œ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—

๋ฌผ๊ณผ ๋‹ฌ๋ฆฌ ๊ณ ์Šด๋„์น˜๋Š” ํ์— ์žˆ๋Š” ๋ชจ๋“  ์นธ์„ ํ•œ ํ„ด์— ์ด๋™ํ•˜์ง€ ์•Š์•„ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฌผ์ด ๋„ˆ๋ฌด ๋นจ๋ฆฌ ํผ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋˜์—ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•œ ํƒ€์ž„์— ํ•œ๋ฒˆ๋งŒ ๋ฌผ์ด ํ™•์žฅ๋˜๊ณ , ๊ณ ์Šด๋„์น˜๊ฐ€ ์ด๋™ํ•œ๋‹ค๋Š”๊ฑธ ๊ตฌํ˜„ํ•˜๋Š”๊ฑฐ์—์„œ ๋ง‰ํ˜”์—ˆ๋‹ค.


# ์ฝ”๋“œ

# 2025-04-15 11:55-12:40
import sys
from collections import deque
sys.stdin = open("input.txt","r")

r,c = map(int,sys.stdin.readline().split())
graph = [list(sys.stdin.readline().strip()) for _ in range(r)]
visited = [[False]*c for _ in range(r)]
# ์ƒํ•˜์ขŒ์šฐ
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# ๊ณ ์Šด๋„์น˜์™€ ๊ตด์˜ ์œ„์น˜ ์ธ๋ฑ์Šค ๊ตฌํ•˜๊ธฐ
water = deque()
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'D':
            tx, ty = i, j
        elif graph[i][j] == 'S':
            sx, sy = i, j
        elif graph[i][j] == '*':
            water.append((i,j))

def bfs(x,y,cnt):
    cnt = 0
    queue = deque()
    queue.append((x,y,cnt))

    while queue:
        # ๋ฌผ์˜ ํ™•์žฅ
        for _ in range(len(water)):
            x, y = water.popleft()
            for i in range(4):
                wx, wy = x + dx[i], y + dy[i]
                if 0 <= wx < r and 0 <= wy < c:
                    if graph[wx][wy] == '.':
                        graph[wx][wy] = '*'
                        water.append((wx,wy))

        # ๊ณ ์Šด๋„์น˜์˜ ์ด๋™
        for _ in range(len(queue)):
            x, y, cnt = queue.popleft()
            visited[x][y] = True
            # print((x,y,cnt))
            if (x, y) == (tx, ty):
                return cnt
        
            for i in range(4):
                nx, ny = x + dx[i], y + dy[i]
                if 0 <= nx < r and 0 <= ny < c:
                    if (graph[nx][ny] == '.' or graph[nx][ny] == 'D') and not visited[nx][ny]:
                        visited[nx][ny] = True
                        queue.append((nx,ny,cnt+1))
    return -1

cnt = bfs(sx,sy,0)
if cnt == -1: print('KAKTUS')
else: print(cnt)

# ์ฐธ๊ณ  (๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ)

๐Ÿ”ฝ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ

water, tmp_water๋ฅผ ์ง‘ํ•ฉ์œผ๋กœ ์ •์˜ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.

# 2025-04-15 11:55-12:40
import sys
from collections import deque
sys.stdin = open("input.txt","r")

r,c = map(int,sys.stdin.readline().split())
graph = [list(sys.stdin.readline().strip()) for _ in range(r)]
visited = [[False]*c for _ in range(r)]
# ์ƒํ•˜์ขŒ์šฐ
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# ๊ณ ์Šด๋„์น˜์™€ ๊ตด์˜ ์œ„์น˜ ์ธ๋ฑ์Šค ๊ตฌํ•˜๊ธฐ
water = set()
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'D':
            tx, ty = i, j
        elif graph[i][j] == 'S':
            sx, sy = i, j
        elif graph[i][j] == '*':
            water.add((i,j))

def bfs(x,y,cnt):
    cnt = 0
    queue = deque()
    queue.append((x,y,cnt))

    while queue:
        # ๋ฌผ์˜ ํ™•์žฅ
        tmp_water = set()
        for w in water:
            for i in range(4):
                wx, wy = w[0] + dx[i], w[1] + dy[i]
                if 0 <= wx < r and 0 <= wy < c:
                    if graph[wx][wy] == '.':
                        graph[wx][wy] = '*'
                        tmp_water.add((wx,wy))
        water.update(tmp_water)

        for _ in range(len(queue)):
            x, y, cnt = queue.popleft()
            visited[x][y] = True
            # print((x,y,cnt))
            if (x, y) == (tx, ty):
                return cnt
            
            # ๊ณ ์Šด๋„์น˜์˜ ์ด๋™ ()
            for i in range(4):
                nx, ny = x + dx[i], y + dy[i]
                if 0 <= nx < r and 0 <= ny < c:
                    if graph[nx][ny] == '.' or graph[nx][ny] == 'D' and not visited[nx][ny]:
                        visited[nx][ny] = True
                        queue.append((nx,ny,cnt+1))
    return -1

cnt = bfs(sx,sy,0)
if cnt == -1: print('KAKTUS')
else: print(cnt)

'๐Ÿ“š Study > Baekjoon' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Gold V] 7576 - ํ† ๋งˆํ†   (0) 2025.04.19
[Silver II] 10971 - ์™ธํŒ์› ์ˆœํšŒ2  (0) 2025.04.16
[Gold IV] 1987 - ์•ŒํŒŒ๋ฒณ  (0) 2025.04.14
[Gold III] 1726 - ๋กœ๋ด‡  (0) 2025.04.14
[Gold V] 14503 - ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ  (0) 2025.04.13