(Python) 프로그래머스 - 아이템 줍기

[문제 링크]

풀이

from collections import deque


def solution(rectangle, characterX, characterY, itemX, itemY):
    answer =0

    # ㄷ자 형태때문에 2배로 풀어서 진행
    board = [[0] * 101 for _ in range(101)]

    # 직사각형 채우기
    make_board(board, rectangle)

    # BFS
    answer = bfs(answer, board, characterX, characterY, itemX, itemY)

    return answer


def make_board(board, rectangle):
    # 경계면 채우기
    for lx, ly, rx, ry in rectangle:
        lx *= 2
        ly *= 2
        rx *= 2
        ry *= 2

        for x in range(lx, rx + 1):
            board[x][ly] = 1
            board[x][ry] = 1
        for y in range(ly, ry + 1):
            board[lx][y] = 1
            board[rx][y] = 1
            
    # 내부 0으로 채우기
    for lx, ly, rx, ry in rectangle:
        for x in range(lx * 2 + 1, rx * 2):
            for y in range(ly * 2 + 1, ry * 2):
                board[x][y] = 0


def bfs(answer, board, characterX, characterY, itemX, itemY):
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    itemX *= 2
    itemY *= 2
    q = deque()
    q.append((characterX * 2, characterY * 2, 0))
    while q:
        x, y, cost = q.popleft()
        if x == itemX and y == itemY:
            answer = cost // 2 # 2배 늘렸으므로 최종 정답은 2로 나눠준다.
            break
        board[x][y] = 0
        for i in range(4):
            px = x + dx[i]
            py = y + dy[i]
            if 0 <= px and px <= 100 and 0 <= py and py <= 100:
                if board[px][py] == 1:
                    q.append((px, py, cost + 1))
    return answer

© 2021. By Backtony