일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 해시
- DFS
- 백트래킹
- 에라토스테네스의 체
- 서브쿼리
- 그래프 탐색
- 크루스칼
- 그래프 이론
- 그리디
- 다이나믹프로그래밍
- 다익스트라
- 브루트포스
- 트리
- GROUP BY
- 투포인터
- 우선순위큐
- 분할정복
- MST
- DP
- 자료구조
- 재귀
- BFS
- 플로이드-워셜
- 시뮬레이션
- 수학
- 누적합
- 다시
- join
- 구현
- 다이나믹 프로그래밍
- Today
- Total
기록하고 까먹지 말기
아이템 줍기 본문
날짜 : 2023. 05. 30
사용 언어 : python
문제
코드
from collections import deque
def solution(rectangle, a, b, itemX, itemY):
graph = [[-1] * 102 for _ in range(102)]
for r in rectangle:
x1, y1, x2, y2 = r
x1 *= 2 # 2배처리
y1 *= 2
x2 *= 2
y2 *= 2
for i in range(x1, x2 + 1):
for j in range(y1, y2 + 1):
if x1 < i < x2 and y1 < j < y2: # 테두리 채우기
graph[i][j] = -2 # 내부
elif graph[i][j] != -2: # 테두리
graph[i][j] = 0
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
queue = deque()
queue.append([a*2, b*2, 0]) # 현재위치 삽입
while queue:
x, y, cnt = queue.popleft()
print(x, y, cnt)
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx == itemX * 2 and ny == itemY * 2: # 도착
return (cnt + 1) // 2
if nx in range(102) and ny in range(102): # 범위에 포함
if graph[nx][ny] == 0: # 방문하지 않았을 때
graph[nx][ny] = cnt + 1 # 방문처리
queue.append([nx, ny, cnt + 1]) # 삽입
풀이
- 기본적인 BFS로 설정해서 문제를 풀다보면 첫번째, 다섯번째 테스트케이스에서 오답이 발생한다.
- 꼭지점에서 1만큼씩 상하좌우로 이동하되, 테두리 라인에 맞추어 이동해야 하는데, 이를 건너뛰는 경우가 발생할 수 있기 때문이다.
- 예컨대 위 사진에서 빨간 점의 좌표는 (5, 5)이고, 각각 x축으로 1, y축으로 1 이동해도 테두리 라인이기 때문에 이동하는데는 문제가 없다.
- 그렇기에 원하는 패턴으로 이동시키기 위해 전체적으로 2를 곱함으로써 1씩 이동하여 발생할 수 있는 오류를 방지한다.
- 그 다음, 이중 for문을 사용하여 디폴트 값으로 -1로 채워진 그래프에서 테두리는 0, 내부는 -2로 채워나간다.
- 0은 이동거리를 체크하기 위한 용도로도 사용되기 때문에 해당 값으로 설정했다.
- 그 다음 현재 위치와 아이템 위치도 2배를 적용하여 BFS로 풀어내면 문제가 해결된다.
알게된 점
- 단순한 BFS문제라고 생각해서 범위를 51로 놓고 그냥 풀었다.
- 당연히 1, 5번째 테케에서 통과를 못했고, 머리를 싸맸다.
- 계속 고민한 결과 답이 안보였고, 다른 사람의 풀이를 참고했고 2배를 곱하는 아이디어를 깨달을 수 있었다.
- 그리고 아이디어를 찾아내니까 오류를 맞이했다.
- 에러는 TypeError: can only concatenate list (not "int") to list -> 연산 과정에서 서로 다른 타입끼리 이루어질 때 발생하는 오류였다.
- 차근차근 코드를 뜯어보니 변수를 간략화한답시고 현재 위치를 r, c로 설정했는데 rectangle에서 for문을 돌릴 때 r, c로 설정해서 돌린 것이 문제였다.
- 그래서 이를 수정했고 문제없이 풀 수 있었다.
참고 사이트
- https://jyeonnyang2.tistory.com/247
[프로그래머스] 아이템 줍기 - 파이썬(python)
문제 설명 다음과 같은 다각형 모양 지형에서 캐릭터가 아이템을 줍기 위해 이동하려 합니다. 지형은 각 변이 x축, y축과 평행한 직사각형이 겹쳐진 형태로 표현하며, 캐릭터는 이 다각형의 둘레
jyeonnyang2.tistory.com
'전공 > 프로그래머스' 카테고리의 다른 글
최솟값 만들기 (0) | 2023.09.12 |
---|---|
미로 탈출 (0) | 2023.06.07 |
가장 먼 노드 (0) | 2023.05.29 |
다리를 지나는 트럭 (0) | 2023.05.29 |
(SQL) 5월 식품들의 총매출 조회하기 (0) | 2023.05.29 |