(Python) 프로그래머스 - 아이템 줍기
in Algorithm on Programmers, Level3
[문제 링크]
풀이
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