@@ -17,38 +17,95 @@ math: true
17
17
## 2. 코드
18
18
19
19
``` 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
+ """
20
60
21
61
from collections import deque
22
62
63
+ # 지형을 나타내는 직사각형이 담긴 2차원 배열 rectangle, 초기 캐릭터의 위치 characterX, characterY, 아이템의 위치 itemX, itemY
23
64
def solution (rectangle , characterX , characterY , itemX , itemY ):
24
65
answer = 0
25
66
67
+ # 모든 좌표값은 1 이상 50 이하인 자연수
26
68
graph = [[- 1 ] * 102 for i in range (102 )]
27
69
28
70
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
30
72
31
73
for i in range (x1, x2+ 1 ):
32
74
for j in range (y1, y2+ 1 ):
75
+
76
+ # 내부일 때
33
77
if x1 < i < x2 and y1 < j < y2:
34
78
graph[i][j] = 0
79
+ # 테두리일 때
35
80
elif graph[i][j] != 0 :
36
81
graph[i][j] = 1
37
82
38
83
dx = [- 1 , 1 , 0 , 0 ]
39
84
dy = [0 , 0 , - 1 , 1 ]
40
85
41
86
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
42
91
92
+ # 최단거리 찾기
43
93
while q:
44
94
x, y = q.popleft()
45
95
96
+ # 캐릭터와 아이템 위치가 같을 때
97
+ if x == itemX * 2 and y == itemY * 2 :
98
+ answer = (visited[x][y] - 1 ) // 2
99
+ break
100
+
46
101
for k in range (4 ):
47
102
nx = x + dx[k]
48
103
ny = y + dy[k]
49
104
50
- if graph[nx][ny] == 1 and visited[nx][ny] == 1 :
105
+ # 방문도 안했고, 테두리인 경우
106
+ if graph[nx][ny] == 1 and visited[nx][ny] == 0 :
51
107
q.append([nx, ny])
108
+ # 최단거리 증가
52
109
visited[nx][ny] = visited[x][y] + 1
53
110
54
111
return answer
@@ -58,6 +115,45 @@ def solution(rectangle, characterX, characterY, itemX, itemY):
58
115
59
116
- 정확성
60
117
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
+
61
153
<br >
62
154
63
155
## 3. 해설
156
+
157
+ - 테두리가 1 1 이렇게 겹칠 경우 중간에 틈이 없어서 최단 경로에 지장을 줌
158
+ - 2배로 길이를 넓혀서 최단 경로를 갈 수 있도록 틈을 준다
159
+ - 그 외에는 똑같이 최단 거리를 만들어서 아이템과 위치가 같다면 경로에서 2를 나눈 값이 답이 된다
0 commit comments