Skip to content

Commit 0f276a3

Browse files
committed
upload: [12주차_이가은] 아이템 줍기
1 parent 38bb8be commit 0f276a3

File tree

1 file changed

+98
-2
lines changed

1 file changed

+98
-2
lines changed

_posts/algorithm/아이템-줍기/2024-01-07-이가은-아이템-줍기.md

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,95 @@ math: true
1717
## 2. 코드
1818

1919
```python
20+
"""
21+
아이템 줍기
22+
23+
💛 문제
24+
다음과 같은 다각형 모양 지형에서 캐릭터가 아이템을 줍기 위해 이동하려 합니다.
25+
지형은 각 변이 x축, y축과 평행한 직사각형이 겹쳐진 형태로 표현하며, 캐릭터는 이 다각형의 둘레(굵은 선)를 따라서 이동합니다.
26+
27+
만약 직사각형을 겹친 후 다음과 같이 중앙에 빈 공간이 생기는 경우, 다각형의 가장 바깥쪽 테두리가 캐릭터의 이동 경로가 됩니다.
28+
단, 서로 다른 두 직사각형의 x축 좌표 또는 y축 좌표가 같은 경우는 없습니다.
29+
즉, 위 그림처럼 서로 다른 두 직사각형이 꼭짓점에서 만나거나, 변이 겹치는 경우 등은 없습니다.
30+
다음 그림과 같이 지형이 2개 이상으로 분리된 경우도 없습니다.
31+
한 직사각형이 다른 직사각형 안에 완전히 포함되는 경우 또한 없습니다.
32+
33+
지형을 나타내는 직사각형이 담긴 2차원 배열 rectangle, 초기 캐릭터의 위치 characterX, characterY,
34+
아이템의 위치 itemX, itemY가 solution 함수의 매개변수로 주어질 때,
35+
캐릭터가 아이템을 줍기 위해 이동해야 하는 가장 짧은 거리를 return 하도록 solution 함수를 완성해주세요.
36+
37+
🧡 제한 사항
38+
rectangle의 세로(행) 길이는 1 이상 4 이하입니다.
39+
rectangle의 원소는 각 직사각형의 [좌측 하단 x, 좌측 하단 y, 우측 상단 x, 우측 상단 y] 좌표 형태입니다.
40+
직사각형을 나타내는 모든 좌표값은 1 이상 50 이하인 자연수입니다.
41+
서로 다른 두 직사각형의 x축 좌표, 혹은 y축 좌표가 같은 경우는 없습니다.
42+
문제에 주어진 조건에 맞는 직사각형만 입력으로 주어집니다.
43+
charcterX, charcterY는 1 이상 50 이하인 자연수입니다.
44+
지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.
45+
itemX, itemY는 1 이상 50 이하인 자연수입니다.
46+
지형을 나타내는 다각형 테두리 위의 한 점이 주어집니다.
47+
캐릭터와 아이템의 처음 위치가 같은 경우는 없습니다.
48+
전체 배점의 50%는 직사각형이 1개인 경우입니다.
49+
전체 배점의 25%는 직사각형이 2개인 경우입니다.
50+
전체 배점의 25%는 직사각형이 3개 또는 4개인 경우입니다.
51+
52+
💚 입출력
53+
rectangle characterX characterY itemX itemY result
54+
[[1,1,7,4],[3,2,5,5],[4,3,6,9],[2,6,8,8]] 1 3 7 8 17
55+
[[1,1,8,4],[2,2,4,9],[3,6,9,8],[6,3,7,7]] 9 7 6 1 11
56+
[[1,1,5,7]] 1 1 4 7 9
57+
[[2,1,7,5],[6,4,10,10]] 3 1 7 10 15
58+
[[2,2,5,5],[1,3,6,4],[3,1,4,6]] 1 4 6 3 10
59+
"""
2060

2161
from collections import deque
2262

63+
# 지형을 나타내는 직사각형이 담긴 2차원 배열 rectangle, 초기 캐릭터의 위치 characterX, characterY, 아이템의 위치 itemX, itemY
2364
def solution(rectangle, characterX, characterY, itemX, itemY):
2465
answer = 0
2566

67+
# 모든 좌표값은 1 이상 50 이하인 자연수
2668
graph = [[-1] * 102 for i in range(102)]
2769

2870
for r in rectangle:
29-
x1, y1, x2, y2 = r[0], r[1], r[2], r[3]
71+
x1, y1, x2, y2 = r[0] * 2, r[1] * 2, r[2] * 2, r[3] * 2
3072

3173
for i in range(x1, x2+1):
3274
for j in range(y1, y2+1):
75+
76+
# 내부일 때
3377
if x1 < i < x2 and y1 < j < y2:
3478
graph[i][j] = 0
79+
# 테두리일 때
3580
elif graph[i][j] != 0:
3681
graph[i][j] = 1
3782

3883
dx = [-1, 1, 0, 0]
3984
dy = [0, 0, -1, 1]
4085

4186
q = deque()
87+
# 첫 시작
88+
q.append([characterX * 2, characterY * 2])
89+
visited = [[0] * 102 for _ in range(102)]
90+
visited[characterX * 2][characterY * 2] = 1
4291

92+
# 최단거리 찾기
4393
while q:
4494
x, y = q.popleft()
4595

96+
# 캐릭터와 아이템 위치가 같을 때
97+
if x == itemX * 2 and y == itemY * 2:
98+
answer = (visited[x][y] - 1) // 2
99+
break
100+
46101
for k in range(4):
47102
nx = x + dx[k]
48103
ny = y + dy[k]
49104

50-
if graph[nx][ny] == 1 and visited[nx][ny] == 1:
105+
# 방문도 안했고, 테두리인 경우
106+
if graph[nx][ny] == 1 and visited[nx][ny] == 0:
51107
q.append([nx, ny])
108+
# 최단거리 증가
52109
visited[nx][ny] = visited[x][y] + 1
53110

54111
return answer
@@ -58,6 +115,45 @@ def solution(rectangle, characterX, characterY, itemX, itemY):
58115

59116
- 정확성
60117

118+
정확성 테스트
119+
테스트 1 〉 통과 (0.23ms, 10.3MB)
120+
테스트 2 〉 통과 (0.22ms, 10.4MB)
121+
테스트 3 〉 통과 (0.24ms, 10.3MB)
122+
테스트 4 〉 통과 (0.23ms, 10.3MB)
123+
테스트 5 〉 통과 (0.22ms, 10.4MB)
124+
테스트 6 〉 통과 (0.22ms, 10.4MB)
125+
테스트 7 〉 통과 (0.24ms, 10.3MB)
126+
테스트 8 〉 통과 (0.24ms, 10.4MB)
127+
테스트 9 〉 통과 (2.56ms, 10.4MB)
128+
테스트 10 〉 통과 (1.58ms, 10.3MB)
129+
테스트 11 〉 통과 (1.11ms, 10.4MB)
130+
테스트 12 〉 통과 (1.41ms, 10.3MB)
131+
테스트 13 〉 통과 (1.22ms, 10.4MB)
132+
테스트 14 〉 통과 (0.73ms, 10.4MB)
133+
테스트 15 〉 통과 (0.34ms, 10.3MB)
134+
테스트 16 〉 통과 (1.21ms, 10.1MB)
135+
테스트 17 〉 통과 (0.91ms, 10.3MB)
136+
테스트 18 〉 통과 (0.57ms, 10.3MB)
137+
테스트 19 〉 통과 (1.19ms, 10.2MB)
138+
테스트 20 〉 통과 (1.43ms, 10.4MB)
139+
테스트 21 〉 통과 (0.63ms, 10.4MB)
140+
테스트 22 〉 통과 (0.39ms, 10.2MB)
141+
테스트 23 〉 통과 (0.89ms, 10.4MB)
142+
테스트 24 〉 통과 (0.70ms, 10.4MB)
143+
테스트 25 〉 통과 (0.26ms, 10.4MB)
144+
테스트 26 〉 통과 (0.43ms, 10.4MB)
145+
테스트 27 〉 통과 (0.31ms, 10.3MB)
146+
테스트 28 〉 통과 (0.31ms, 10.4MB)
147+
테스트 29 〉 통과 (0.32ms, 10.5MB)
148+
테스트 30 〉 통과 (0.47ms, 10.3MB)
149+
채점 결과
150+
정확성: 100.0
151+
합계: 100.0 / 100.0
152+
61153
<br>
62154

63155
## 3. 해설
156+
157+
- 테두리가 1 1 이렇게 겹칠 경우 중간에 틈이 없어서 최단 경로에 지장을 줌
158+
- 2배로 길이를 넓혀서 최단 경로를 갈 수 있도록 틈을 준다
159+
- 그 외에는 똑같이 최단 거리를 만들어서 아이템과 위치가 같다면 경로에서 2를 나눈 값이 답이 된다

0 commit comments

Comments
 (0)