We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 5427๋ฒˆ: ๋ถˆ - ํŒŒ์ด์ฌ

Redddy 2022. 9. 11. 17:08

๐Ÿ”ˆ ๋ฌธ์ œ

์ƒ๊ทผ์ด๋Š” ๋นˆ ๊ณต๊ฐ„๊ณผ ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฑด๋ฌผ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๊ฑด๋ฌผ์˜ ์ผ๋ถ€์—๋Š” ๋ถˆ์ด ๋‚ฌ๊ณ , ์ƒ๊ทผ์ด๋Š” ์ถœ๊ตฌ๋ฅผ ํ–ฅํ•ด ๋›ฐ๊ณ  ์žˆ๋‹ค.
๋งค ์ดˆ๋งˆ๋‹ค, ๋ถˆ์€ ๋™์„œ๋‚จ๋ถ ๋ฐฉํ–ฅ์œผ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ํผ์ ธ๋‚˜๊ฐ„๋‹ค. ๋ฒฝ์—๋Š” ๋ถˆ์ด ๋ถ™์ง€ ์•Š๋Š”๋‹ค. ์ƒ๊ทผ์ด๋Š” ๋™์„œ๋‚จ๋ถ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค. ์ƒ๊ทผ์ด๋Š” ๋ฒฝ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๊ณ , ๋ถˆ์ด ์˜ฎ๊ฒจ์ง„ ์นธ ๋˜๋Š” ์ด์ œ ๋ถˆ์ด ๋ถ™์œผ๋ ค๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ์ƒ๊ทผ์ด๊ฐ€ ์žˆ๋Š” ์นธ์— ๋ถˆ์ด ์˜ฎ๊ฒจ์˜ด๊ณผ ๋™์‹œ์— ๋‹ค๋ฅธ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋นŒ๋”ฉ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ๋นŒ๋”ฉ์„ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

๐Ÿ“์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์ตœ๋Œ€ 100๊ฐœ์ด๋‹ค.
๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ๋นŒ๋”ฉ ์ง€๋„์˜ ๋„ˆ๋น„์™€ ๋†’์ด w์™€ h๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ w,h ≤ 1000)
๋‹ค์Œ h๊ฐœ ์ค„์—๋Š” w๊ฐœ์˜ ๋ฌธ์ž, ๋นŒ๋”ฉ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

'.': ๋นˆ ๊ณต๊ฐ„
'#': ๋ฒฝ
'@': ์ƒ๊ทผ์ด์˜ ์‹œ์ž‘ ์œ„์น˜
'*': ๋ถˆ

๊ฐ ์ง€๋„์— @์˜ ๊ฐœ์ˆ˜๋Š” ํ•˜๋‚˜์ด๋‹ค.

 

๐Ÿ“‘์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํŒŒ์ดํ”„์˜ ํ•œ์ชฝ ๋์„ (N, N)์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋Š” ํ•ญ์ƒ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

 

ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” BFS ๋ฌธ์ œ์˜ ์œ ํ˜•์ด์˜€๋‹ค.

A์—์„œ B๋กœ ๊ฐˆ ๋•Œ์˜ ์†Œ์š”์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์˜€๊ณ , A๋Š” @์˜ ์œ„์น˜ ๊ทธ๋ฆฌ๊ณ  B๋Š” #์ด ์•„๋‹Œ ๊ฐ€์žฅ์ž๋ฆฌ์ด๋‹ค.

๋‹ค๋งŒ ๋ถˆ์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋ถˆ์ด ๋ถ™์€ ๊ณณ์€ ์ด๋™ํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ์ด ๊ฒฝ์šฐ๋ฅผ ๊ฐ™์ด ํ™•์ธํ•ด์ค˜์•ผ ํ–ˆ๋‹ค.

 

๋ถˆ์ด ๋ถ™๋Š” ๊ฒฝ๋กœ์™€ ์ƒ๊ทผ์ด์˜ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์กฐ๊ธˆ ๋ณต์žกํ•ด์กŒ๋‹ค. ๊ทธ๋ž˜์„œ ๋จผ์ € ๋ถˆ์„ ์ง€๋ฅด๊ณ  ์ƒ๊ทผ์ด๋ฅผ ์ด๋™์‹œ์ผฐ๋‹ค. ์ฆ‰ ๊ฐ ๊ฒฝ๋กœ๋งˆ๋‹ค ๋ถˆ์ด ๋ถ™๋Š” ์‹œ๊ฐ„์„ ์ฒดํฌํ•ด๋‘”๋’ค ์ƒ๊ทผ์ด๊ฐ€ ๊ทธ ์ง€์ ์— ์˜ค๋Š” ์‹œ๊ฐ„๊ณผ ๋น„๊ตํ•˜์—ฌ ์ƒ๊ทผ์ด๊ฐ€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒŒ์•…ํ•˜์˜€๋‹ค.

 

๋ถˆ์˜ ์ดˆ๊ธฐ ์œ„์น˜๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  BFS๋ฅผ ํ†ตํ•ด '#'์„ ๋นผ๊ณ  ๋ถˆ์„ ์งˆ๋ €๋‹ค.

๋ถˆ์ด ๋ถ™์€ ์‹œ๊ฐ„์ด ๋‹ด๊ธด ๋ฐฐ์—ด์„ ๊ฐ–๊ณ  ์ด์ œ ์ƒ๊ทผ์ด๋ฅผ ์›€์ง์˜€๋‹ค.

์ƒ๊ทผ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋Š” '#'์ด ์•„๋‹ˆ๊ณ  ๋ถˆ์ด ๋ถ™์€ ์‹œ๊ฐ„๋ณด๋‹ค ์ƒ๊ทผ์ด๊ฐ€ ๋” ๋นจ๋ฆฌ ๋„์ฐฉํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from collections import deque
import sys
input = sys.stdin.readline
 
dx = [0,1,-1,0]
dy = [1,0,0,-1]
 
# ๋ถˆ ์ง€๋ฅด๊ธฐ
def burn():
    while queue:
        x,y,t = queue.popleft()
        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:
                continue
            # ๋ฒฝ์ด ์•„๋‹ˆ๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
            if graph[nx][ny] != '#' and visited[nx][ny] == 0:
                visited[nx][ny] = t + 1
                queue.append([nx,ny,t+1])
    return visited
 
# ์ƒ๊ทผ์ด ์ด๋™
def bfs(a,b):
    q = deque()
    q.append([a,b,1])
    while q:
        x,y,c = q.popleft()
        # ํƒˆ์ถœํ–ˆ๋‹ค๋ฉด 
        if x == h-1 or y == w-1 or x == 0 or y == 0:
            return c
 
        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:
                continue
            # ๋ฒฝ์ด ์•„๋‹ˆ๋ผ๋ฉด
            if graph[nx][ny] != '#':
                # ๋ถˆ์ด ๋ถ™๊ธฐ ์ „์— ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ๋ถˆ์ด ๋ถ™์ง€ ์•Š๋Š” ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ
                if c+1 < visit[nx][ny] and visit[nx][ny] != -1 or visit[nx][ny]==0:
                    q.append([nx,ny,c+1])
                    visit[nx][ny] = -1
    
    # ๋ฃจํ”„๋ฌธ ๋๋‚ฌ๋Š”๋ฐ๋„ ํƒˆ์ถœํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด 
    return 'IMPOSSIBLE'
 
for _ in range(int(input())):
    w,h = map(int,input().split())
    graph = [list(map(str,input().rstrip())) for _ in range(h)]
    # ๋ถˆ์ด ๋ถ™์€ ์œ„์น˜ ๋‹ด์„ ํ
    queue = deque()
    visited = [[0]*(w) for _ in range(h)]
    for i in range(h):
        for j in range(w):
            # ํ•ด๋‹น ๊ตฌ์—ญ์— ๋ถˆ์ด ๋ถ™์—ˆ๋‹ค๋ฉด ํ์— ์ขŒํ‘œ ์‚ฝ์ž…
            if graph[i][j] == '*':
                queue.append([i,j,1])
                visited[i][j] = 1
            # ์ƒ๊ทผ์ด๊ฐ€ 
            elif graph[i][j] == '@':
                sx,sy = i,j
    visit = burn()
 
    print(bfs(sx,sy))
cs

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

25ํ”„๋กœ...ใ…Ž

๋ฌธ์ œ์˜ ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด๋‚ด๋Š”๋Œ€ ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค..ใ…‹ใ…‹ใ…‹(์•ž์—์„œ๋Š” ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” BFS๋ผ๋ฉฐ)

๐Ÿ”— ๋ฌธ์ œ๋งํฌ ๋ถˆ

 

5427๋ฒˆ: ๋ถˆ

์ƒ๊ทผ์ด๋Š” ๋นˆ ๊ณต๊ฐ„๊ณผ ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฑด๋ฌผ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๊ฑด๋ฌผ์˜ ์ผ๋ถ€์—๋Š” ๋ถˆ์ด ๋‚ฌ๊ณ , ์ƒ๊ทผ์ด๋Š” ์ถœ๊ตฌ๋ฅผ ํ–ฅํ•ด ๋›ฐ๊ณ  ์žˆ๋‹ค. ๋งค ์ดˆ๋งˆ๋‹ค, ๋ถˆ์€ ๋™์„œ๋‚จ๋ถ ๋ฐฉํ–ฅ์œผ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ํผ์ ธ๋‚˜๊ฐ„๋‹ค. ๋ฒฝ์—

www.acmicpc.net