๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[BAEKJOON python] 13460_๊ตฌ์Šฌ ํƒˆ์ถœ2 ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/BAEKJOON

[BAEKJOON python] 13460_๊ตฌ์Šฌ ํƒˆ์ถœ2

์ง•์ง•์•ŒํŒŒ์นด 2022. 10. 10. 12:35
728x90
๋ฐ˜์‘ํ˜•
๊ตฌ์Šฌ ํƒˆ์ถœ์€ ์ง์‚ฌ๊ฐํ˜• ๋ณด๋“œ์— ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์„ ํ•˜๋‚˜์”ฉ ๋„ฃ์€ ๋‹ค์Œ,
๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ด๋Š” ๊ฒŒ์ž„์ด๋‹ค.

๋ณด๋“œ์˜ ์„ธ๋กœ ํฌ๊ธฐ๋Š” N, ๊ฐ€๋กœ ํฌ๊ธฐ๋Š” M์ด๊ณ , ํŽธ์˜์ƒ 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.
๊ฐ€์žฅ ๋ฐ”๊นฅ ํ–‰๊ณผ ์—ด์€ ๋ชจ๋‘ ๋ง‰ํ˜€์ ธ ์žˆ๊ณ , ๋ณด๋“œ์—๋Š” ๊ตฌ๋ฉ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.
๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์˜ ํฌ๊ธฐ๋Š” ๋ณด๋“œ์—์„œ 1×1ํฌ๊ธฐ์˜ ์นธ์„ ๊ฐ€๋“ ์ฑ„์šฐ๋Š” ์‚ฌ์ด์ฆˆ์ด๊ณ  ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.
๊ฒŒ์ž„์˜ ๋ชฉํ‘œ๋Š” ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด์„œ ๋นผ๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

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

๋ณด๋“œ์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋งŒ์— ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ
์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ณด๋“œ์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ •์ˆ˜ N, M (3 ≤ N, M ≤ 10)
๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๋ณด๋“œ์˜ ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธธ์ด M์˜ ๋ฌธ์ž์—ด
    ๋ฌธ์ž์—ด์€ '.', '#', 'O', 'R', 'B' ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
    '.'์€ ๋นˆ ์นธ์„ ์˜๋ฏธํ•˜๊ณ , '#'์€ ๊ณต์ด ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์žฅ์• ๋ฌผ ๋˜๋Š” ๋ฒฝ์„ ์˜๋ฏธํ•˜๋ฉฐ,
    'O'๋Š” ๊ตฌ๋ฉ์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    'R'์€ ๋นจ๊ฐ„ ๊ตฌ์Šฌ์˜ ์œ„์น˜, 'B'๋Š” ํŒŒ๋ž€ ๊ตฌ์Šฌ์˜ ์œ„์น˜
์ž…๋ ฅ๋˜๋Š” ๋ชจ๋“  ๋ณด๋“œ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์—๋Š” ๋ชจ๋‘ '#'์ด ์žˆ๋‹ค.
๊ตฌ๋ฉ์˜ ๊ฐœ์ˆ˜๋Š” ํ•œ ๊ฐœ ์ด๋ฉฐ, ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์€ ํ•ญ์ƒ 1๊ฐœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋งŒ์— ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ถœ๋ ฅ
๋งŒ์•ฝ, 10๋ฒˆ ์ดํ•˜๋กœ ์›€์ง์—ฌ์„œ ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ผ ์ˆ˜ ์—†์œผ๋ฉด -1์„ ์ถœ๋ ฅ
# 1) BFS
import sys
from collections import deque
input = sys.stdin.readline

# ๋ณด๋“œ์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ
N, M = map(int, input().split())

# '.'์€ ๋นˆ ์นธ
# '#'์€ ๊ณต์ด ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์žฅ์• ๋ฌผ ๋˜๋Š” ๋ฒฝ
# 'O'๋Š” ๊ตฌ๋ฉ์˜ ์œ„์น˜
# 'R'์€ ๋นจ๊ฐ„ ๊ตฌ์Šฌ์˜ ์œ„์น˜
# 'B'๋Š” ํŒŒ๋ž€ ๊ตฌ์Šฌ์˜ ์œ„์น˜
graph = []
for i in range(N) :
    graph.append(list(input()))
    for j in range(M) :
        if graph[i][j] == "R" :
            rx, ry = i, j
        elif graph[i][j] == "B" :
            bx, by = i, j

# ๊ธฐ์šธ๊ธฐ
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def bfs(rx, ry, bx, by) :
    q = deque()
    q.append((rx, ry, bx, by))
    cnt = 0
    visited = []
    visited.append((rx, ry, bx, by))

    while q :
        for _ in range(len(q)):
            rx, ry, bx, by = q.popleft()

            # ์›€์ง์ธ๊ฑฐ 10๋ฒˆ ์ด์ƒ
            if cnt > 10 :
                print(-1)
                return
            # ๋นจ๊ฐ„ ๊ตฌ์Šฌ ์œ„์น˜๊ฐ€ ๊ตฌ๋ฉ
            if graph[rx][ry] == "O" :
                print(cnt)
                return

            # ๋ฐฉํ–ฅ ํƒ์ƒ‰
            for i in range(4) :
                # ๋นจ๊ฐ„ ๊ตฌ์Šฌ๋ถ€ํ„ฐ
                rnx, rny = rx, ry
                while True :
                    rnx += dx[i]
                    rny += dy[i]
                    if graph[rnx][rny] == "#" :
                        rnx -= dx[i]
                        rny -= dy[i]
                        break
                    if graph[rnx][rny] == "O" :
                        break

                # ํŒŒ๋ž€ ๊ตฌ์Šฌ
                bnx, bny = bx, by
                while True :
                    bnx += dx[i]
                    bny += dy[i]
                    if graph[bnx][bny] == "#":
                        bnx -= dx[i]
                        bny -= dy[i]
                        break
                    if graph[bnx][bny] == "O":
                        break

                # ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๊ตฌ๋ฉ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋จ
                if graph[bnx][bny] == "O" :
                    continue
                # ๊ฐ™์ด ์žˆ์„ ์ˆ˜ ์—†์Œ
                if rnx == bnx and bny == rny :
                    if abs(rnx - rx) + abs(rny - ry) > abs(bnx - bx) + abs(bny - by) :
                        # ๋” ๋งŽ์ด ๊ฐ„ ์• ๊ฐ€ ๋Šฆ๊ฒŒ ๊ฐ„ ์• ์ž„. ๋’ค๋กœ ๊ฐ€์…ˆ
                        rnx -= dx[i]
                        rny -= dy[i]
                    else :
                        bnx -= dx[i]
                        bny -= dy[i]

                if (rnx, rny, bnx, bny) not in visited :
                    q.append((rnx, rny, bnx, bny))
                    visited.append((rnx, rny, bnx, bny))
        cnt += 1
    print(-1)

bfs(rx, ry, bx, by)

# input
# 10 10
# ##########
# #R#...##B#
# #...#.##.#
# #####.##.#
# #......#.#
# #.######.#
# #.#....#.#
# #.#.#.#..#
# #...#.O#.#
# ##########

# output
# -1
728x90
๋ฐ˜์‘ํ˜•
Comments