[BOJ] 13460. ๊ตฌ์Šฌ ํƒˆ์ถœ2 (๐Ÿ”ฎ, ๊ตฌํ˜„/์‹œ๋ฎฌ๋ ˆ์ด์…˜/๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰)

lemythe423ยท2024๋…„ 2์›” 9์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
106/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์˜ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ๋ฐฉ์‹๊ณผ ๊ตฌ์Šฌ์˜ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ•ฉํ•ด์„œ ํ’€์ดํ–ˆ๋‹ค.

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

์–ด๋–ค ๊ตฌ์Šฌ์ด๋“  ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ์ขŒํ‘œ ์ƒ์—๋Š” ์œ„์น˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ๋Š” (-1, -1)๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ๋งŒ์•ฝ ๋‘ ๊ตฌ์Šฌ์˜ ์ขŒํ‘œ๊ฐ€ ํ•ด๋‹น ์ขŒํ‘œ๊ฐ’์ด๋ผ๋ฉด ๊ตฌ๋ฉ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ๋‹ค.

๋‘ ๊ตฌ์Šฌ์˜ ์œ„์น˜ ์ขŒํ‘œ๊ฐ’์„ ํ‚ค ๊ฐ’์œผ๋กœ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋‹ค. ๋‘ ๊ตฌ์Šฌ์˜ ์œ„์น˜์™€ ๋˜‘๊ฐ™์€ ์œ„์น˜์— ๋‹ค์‹œ ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ฒฐ๊ตญ ํ•œ ๋ฒˆ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์ด ๋˜๋ฏ€๋กœ, ๋‘ ๊ตฌ์Šฌ์˜ ์œ„์น˜๊ฐ’๊ณผ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ๋˜ ๋‚˜์™€์„œ ๋˜ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ํ•˜๋Š” ์ผ์€ ์—†๊ฒŒ ํ–ˆ๋‹ค.

๋นจ๊ฐ„ ๊ตฌ์Šฌ๋งŒ ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ ์นด์šดํŠธ ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค. ์ด๋•Œ ํŒŒ๋ž€ ๊ตฌ์Šฌ๋„ ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ๊ฒฝ์šฐ๋Š” ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ”๋‹ค.

๋ฐ˜๋ก€

7 8
########
#.#O.#R#
#....#B#
#.#....#
#......#
#......#
########

answer : 9

# ๊ตฌ์Šฌ ํƒˆ์ถœ

def move(this_x, this_y, other_x, other_y, d, is_red):
    global is_blue_in_hole, is_red_in_hole

    while True: 
        next_x = this_x + direction[d][0]
        next_y = this_y + direction[d][1]
        if board[next_x][next_y] == "#" or (next_x == other_x and next_y == other_y):
            return this_x, this_y
        elif board[next_x][next_y] == "O":
            if is_red:
                is_red_in_hole = True
            else:
                is_blue_in_hole = True
            return (-1, -1)
        
        this_x = next_x
        this_y = next_y

def up(R, B):
    if R[0] <= B[0]:
        R = move(*R, *B, 0, True)
        B = move(*B, *R, 0, False)
    else:
        B = move(*B, *R, 0, False)
        R = move(*R, *B, 0, True)
    return R, B

def down(R, B):
    if R[0] >= B[0]:
        R = move(*R, *B, 1, True)
        B = move(*B, *R, 1, False)
    else:
        B = move(*B, *R, 1, False)
        R = move(*R, *B, 1, True)
    return R, B

def right(R, B):
    if R[1] >= B[1]:
        R = move(*R, *B, 2, True)
        B = move(*B, *R, 2, False)
    else:
        B = move(*B, *R, 2, False)
        R = move(*R, *B, 2, True)
    return R, B

def left(R, B):
    if R[1] <= B[1]:
        R = move(*R, *B, 3, True)
        B = move(*B, *R, 3, False)
    else:
        B = move(*B, *R, 3, False)
        R = move(*R, *B, 3, True)
    return R, B

N, M = map(int, input().split())
board = [list(input()) for _ in range(N)]
direction = ((-1, 0), (1, 0), (0, 1), (0, -1))

for i in range(N):
    for j in range(M):
        if board[i][j] == "R":
            R = (i, j)
            board[i][j] = "."
        elif board[i][j] == "B":
            B = (i, j)
            board[i][j] = "."

is_red_in_hole = False
is_blue_in_hole = False

def sol(R, B):
    move_fn = {
        0: (lambda x: up(x[0], x[1])),
        1: (lambda x: down(x[0], x[1])),
        2: (lambda x: right(x[0], x[1])),
        3: (lambda x: left(x[0], x[1]))
    }
    visited = {(R, B): True}
    queue = [(R, B, 0)]
    while queue:
        R, B, cnt = queue.pop(0)
        # print(R, B, cnt)
        if cnt >= 10:
            return -1

        for k in range(4):
            new_R, new_B = move_fn[k]((R, B))

            if not visited.get((new_R, new_B)):
                visited[(new_R, new_B)] = True
                queue.append((new_R, new_B, cnt+1))

            if new_R == (-1, -1) and new_B != (-1, -1):
                return cnt + 1
    
    return -1

print(sol(R, B))
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€