Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
Archives
- Today
- Total
기록
프로그래머스_아이템 줍기 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/87694
풀이
우선, (1) 테두리를 포함한 사각형을 1로 채운다.
그리고 (2) 사각형의 내부를 0으로 채워 가장 바깥쪽 테두리만 남긴다.
마지막으로 (3) 탐색을 통해 캐릭터와 아이템 사이의 최단 경로를 구한다.
1. 좌표를 2배로 확대
주어진 좌표에 따라 사각형을 그려보면, 좌표가 인접한 경우 탐색을 제대로 하기 어렵다. 따라서, 좌표를 2배로 확대해서, 테두리 사이의 공간을 마련해 주어야 한다.
2. 너비우선탐색
캐릭터의 위치를 상하좌우로 움직여가면서 아이템까지의 최단 거리를 구한다.
아래 코드에서는 이미 탐색한 좌표에 대해서는 -1을 저장하여 다시 방문하지 않도록 했다.
코드
def solution(rectangle, characterX, characterY, itemX, itemY):
MAXNUM = 1000
board = [[0 for j in range(MAXNUM)] for i in range(MAXNUM)]
# 사각형 1로 채우기 (테두리+내부)
for c1, r1, c2, r2 in rectangle :
for i in range(2*r1, 2*r2+1) :
for j in range(2*c1, 2*c2+1) :
board[i][j] = 1
# 사각형 테두리 0으로 채우기
for c1, r1, c2, r2 in rectangle :
for i in range(2*r1+1, 2*r2) :
for j in range(2*c1+1, 2*c2) :
board[i][j] = 0
# 테두리 따라가기
chR, chC, itR, itC = 2*characterY, 2*characterX, 2*itemY, 2*itemX
stack = [(0, chR, chC)]
while stack :
w, chR, chC = stack.pop(0) # 너비 우선 탐색
board[chR][chC] = -1 # passed
if board[itR][itC]<0 : return w//2
for dr, dc in [(1, 0), (-1, 0), (0, 1), (0, -1)] :
if board[chR+dr][chC+dc]>0 :
stack.append((w+1, chR+dr, chC+dc))
'코딩테스트 > python' 카테고리의 다른 글
프로그래머스_python_순위 검색 (0) | 2022.01.12 |
---|---|
프로그래머스_python_도둑질 (0) | 2022.01.10 |
프로그래머스_python_올바른 괄호의 갯수 (0) | 2022.01.06 |
프로그래머스_python_최적의 행렬 곱셈 (0) | 2021.12.29 |
프로그래머스_python_섬 연결하기 (0) | 2021.12.29 |
Comments