๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๊ฐ“์ƒ ์ง์žฅ์ธ ๋‚จ๋ฐ”์˜ค
article thumbnail

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

 

13460๋ฒˆ: ๊ตฌ์Šฌ ํƒˆ์ถœ 2

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ณด๋“œ์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ •์ˆ˜ N, M (3 ≤ N, M ≤ 10)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๋ณด๋“œ์˜ ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธธ์ด M์˜ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ '.', '#', 'O', 'R', 'B'

www.acmicpc.net

๋ฌธ์ œ ํ•ด๊ฒฐ

1. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. -> ์ฒ˜์Œ์— ํ•œ ๋ฒˆ์— ๋ฐ›๊ณ  ๊ทธ ๋‹ค์Œ์— 'R', 'B'๋ฅผ ์ฐพ์•„๋ณด๋ ค ํ–ˆ์œผ๋‚˜ ๊ทธ๋ƒฅ ํฌ๋ฌธ์•ˆ์—์„œ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด์„œ ์ฐพ์•„๋„ ๋˜๊ฒ ๋‹ค ์‹ถ์–ด์„œ ์ฐพ์€ ํ›„์—” ๋นˆ์นธ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

2. ์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋ฐฐ์—ด ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด๊ฐ€๋ฉด์„œ ํ‘ธ๋Š” ๊ฒŒ ์ข‹๊ธฐ ๋•Œ๋ฌธ์— bfs๋กœ ๋ฌธ์ œํ’€์ด

3. bfs๋Š” ์ฃผ๋กœ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋„ฃ์€ ์ˆœ์„œ๋Œ€๋กœ popํ•˜๊ธฐ ์œ„ํ•ด์„œ deque ์‚ฌ์šฉ

4. ๊ธฐ์šธ์ผ ๋•Œ ํ•œ ๋ฒˆ ์›€์ง์ธ ๊ฒŒ ์นด์šดํŠธ 1์€ ์•„๋‹ˆ์ง€๋งŒ, ๋‚˜์ค‘์— ์–ด๋–ค ๊ตฌ์Šฌ์ด ๋จผ์ € ์œ„์น˜ํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ moving์„ ์‚ฌ์šฉํ•ด์„œ ๋ช‡ ๋ฒˆ ์ด๋™ํ–ˆ๋Š”์ง€๋„ ์นด์šดํŠธํ•ด์ฃผ์—ˆ๋‹ค. ํ•œ ๋ฒˆ ๊ธฐ์šธ์˜€๋‹ค๋Š” ๊ฑด queue์— ๊ฐ™์ด ๋„ฃ์–ด์คŒ (count)

5. blue๊ฐ€ ๋จผ์ € ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ”์„ ๋• ์‹คํŒจ์ด๋ฏ€๋กœ ๋‹ค์‹œ ์ง„ํ–‰ (continue)

6. red๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด count+1 ๋ฆฌํ„ด

7. ์ด์ „๊ณผ ๋˜‘๊ฐ™์€ ์ž๋ฆฌ๋ผ๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฑฐ๊ธฐ ๋•Œ๋ฌธ์— continueํ•ด์ฃผ๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์‹œ ๊ทธ ์ขŒํ‘œ๋ฅผ queue์— ์ž…๋ ฅ

from collections import deque

# . # 0 R B => ๋นˆ์นธ, ์žฅ์• ๋ฌผ, ๊ตฌ๋ฉ, ๋นจ๊ฐ„๊ตฌ์Šฌ, ํŒŒ๋ž€๊ตฌ์Šฌ
N, M = map(int, input().split())
arr = []
red_x, red_y = 0, 0
blue_x, blue_y = 0, 0
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

for i in range(N):
    arr.append(list(input().strip()))
    for j in range(len(arr[i])):
        if arr[i][j] == 'R':
            red_x, red_y = i, j
            arr[i][j] = '.'
        elif arr[i][j] == 'B':
            blue_x, blue_y = i, j
            arr[i][j] = '.'

def move(x, y, dx, dy):
    next_x, next_y = x, y
    moving = 0
    while True:
        if arr[next_x+dx][next_y+dy] != '#' and arr[next_x+dx][next_y+dy] != 'O':
            next_x += dx
            next_y += dy
            moving += 1
        else:
            break

    return next_x, next_y, moving


def bfs():
    q = deque()
    q.append((red_x, red_y, blue_x, blue_y, 0))
    while q:
        rx, ry, bx, by, count = q.popleft()
        if count >= 10:
            break

        for k in range(4):
            next_rx, next_ry, Rmove = move(rx, ry, dx[k], dy[k])
            next_bx, next_by, Bmove = move(bx, by, dx[k], dy[k])

            if arr[next_bx+dx[k]][next_by+dy[k]] == 'O':
                continue

            if arr[next_rx+dx[k]][next_ry+dy[k]] == 'O':
                return (count+1)

            if next_rx == next_bx and next_ry == next_by:
                if Rmove > Bmove:
                    next_rx -= dx[k]
                    next_ry -= dy[k]
                else:
                    next_bx -= dx[k]
                    next_by -= dy[k]

            if next_rx == rx and next_ry == ry and next_bx == bx and next_by == by:
                continue

            q.append((next_rx, next_ry, next_bx, next_by, count+1))
    
    return -1

result = bfs()
print(result)

์ •๋ง ์—ด๋ฐ›์•˜๋˜,, ์•Œ๊ณ ๋ณด๋‹ˆ x,y ๋ฅผ ์ž˜๋ชป์ผ๋‹ต๋‹ˆ๋‹ค ๐Ÿ˜‡

profile

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๊ฐ“์ƒ ์ง์žฅ์ธ ๋‚จ๋ฐ”์˜ค

@๋‚จ๋ฐ”์˜ค