Notice
Recent Posts
Recent Comments
Link
나의 개발일지
[프로그래머스] Lv.3 아이템 줍기 [Python, 파이썬] 본문
- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/87694
- 겹치는 사각형들의 테두리만 잘 표현하면 BFS 구현만으로 풀 수 있다.
- 키 포인트 : 사각형의 크기를 2배로 늘린다.
- 사각형들의 크기를 2배로 키우는 이유는 꺾이는 부분에서 문제가 생기기 때문이다.
from collections import deque
def solution(rectangle, characterX, characterY, itemX, itemY):
map = [[0] * 102 for _ in range(102)] # 사각형을 2배 크기로 그리기 위해 2배정도 늘린 맵
visit = [[0] * 102 for _ in range(102)] # 방문 체크, 거리 체크
for i in rectangle: # 사각형 그리기
for j in range(i[1]*2, i[3]*2+1):
for k in range(i[0]*2, i[2]*2+1):
if map[j][k] == 4: # 이미 만들어진 사각형 안이면 건너뛰기
continue
if j == i[1]*2 or j == i[3]*2 or k == i[0]*2 or k == i[2]*2: # 테두리 부분은 1
map[j][k] = 1
else:
map[j][k] = 4 # 테두리가 아니고 사각형 안이면 4
que = deque([(characterY*2, characterX*2)]) # 시작 위치, 사각형이 2배라서 위치도 2배
visit[characterY*2][characterX*2] = 1 # 시작 위치 1로 체크
mx, my = [-1, 1, 0, 0], [0, 0, -1, 1] # 상,하,좌,우
while que:
x, y = que.popleft() # 현재 위치 x = 행, y = 열
if x == itemY*2 and y == itemX*2: # 현재 위치가 아이템 위치면 리턴
return visit[x][y] // 2 # 정답 리턴
for i in range(4): # 상,하,좌,우 이동
nx, ny = x + mx[i], y + my[i] # 다음 이동 위치 nx, ny
if 0 <= nx <= 102 and 0 <= ny <= 102: # 맵 범위를 벗어나지 않을 때
if map[nx][ny] == 1 and visit[nx][ny] == 0: # 테두리고 방문 안했을 때
que.append((nx, ny))
visit[nx][ny] = visit[x][y] + 1
'프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.3 정수 삼각형 [Python, 파이썬] (0) | 2023.03.24 |
---|---|
[프로그래머스] Lv3. 여행경로 [Python, 파이썬] (0) | 2023.03.24 |
[프로그래머스] Lv.3 가장 먼 노드 (그래프) [Python, 파이썬] (0) | 2023.03.17 |
[프로그래머스] Lv.3 네트워크 (DFS) [Python, 파이썬] (0) | 2023.03.12 |
[프로그래머스] Lv.2 게임 맵 최단거리 [Python, 파이썬] (0) | 2023.03.11 |
Comments