Skip to content

Commit 2aac735

Browse files
committed
[Gold I] Title: 택배, Time: 44 ms, Memory: 80380 KB, Score: 100 point -BaekjoonHub
1 parent ca42775 commit 2aac735

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
# [Gold I] 택배 - 8980
2+
3+
[문제 링크](https://www.acmicpc.net/problem/8980)
4+
5+
### 성능 요약
6+
7+
메모리: 80380 KB, 시간: 44 ms
8+
9+
### 분류
10+
11+
그리디 알고리즘, 정렬
12+
13+
### 제출 일자
14+
15+
2025년 6월 20일 20:20:48
16+
17+
### 문제 설명
18+
19+
<p>아래 그림과 같이 직선 도로상에 왼쪽부터 오른쪽으로 1번부터 차례대로 번호가 붙여진 마을들이 있다. 마을에 있는 물건을 배송하기 위한 트럭 한 대가 있고, 트럭이 있는 본부는 1번 마을 왼쪽에 있다. 이 트럭은 본부에서 출발하여 1번 마을부터 마지막 마을까지 오른쪽으로 가면서 마을에 있는 물건을 배송한다. </p>
20+
21+
<p style="text-align: center;"><img alt="" src="" style="width: 236px; height: 92px;"></p>
22+
23+
<p>각 마을은 배송할 물건들을 박스에 넣어 보내며, 본부에서는 박스를 보내는 마을번호, 박스를 받는 마을번호와 보낼 박스의 개수를 알고 있다. 박스들은 모두 크기가 같다. 트럭에 최대로 실을 수 있는 박스의 개수, 즉 트럭의 용량이 있다. 이 트럭 한대를 이용하여 다음의 조건을 모두 만족하면서 최대한 많은 박스들을 배송하려고 한다.</p>
24+
25+
<ul>
26+
<li>조건 1: 박스를 트럭에 실으면, 이 박스는 받는 마을에서만 내린다.</li>
27+
<li>조건 2: 트럭은 지나온 마을로 되돌아가지 않는다.</li>
28+
<li>조건 3: 박스들 중 일부만 배송할 수도 있다.</li>
29+
</ul>
30+
31+
<p>마을의 개수, 트럭의 용량, 박스 정보(보내는 마을번호, 받는 마을번호, 박스 개수)가 주어질 때, 트럭 한 대로 배송할 수 있는 최대 박스 수를 구하는 프로그램을 작성하시오. 단, 받는 마을번호는 보내는 마을번호보다 항상 크다.</p>
32+
33+
<p>예를 들어, 트럭 용량이 40이고 보내는 박스들이 다음 표와 같다고 하자.</p>
34+
35+
<table class="table table-bordered" style="width:30%;">
36+
<thead>
37+
<tr>
38+
<th style="width:10%">보내는 마을</th>
39+
<th style="width:10%">받는 마을</th>
40+
<th style="width:10%">박스 개수</th>
41+
</tr>
42+
</thead>
43+
<tbody>
44+
<tr>
45+
<td>1</td>
46+
<td>2</td>
47+
<td>10</td>
48+
</tr>
49+
<tr>
50+
<td>1</td>
51+
<td>3</td>
52+
<td>20</td>
53+
</tr>
54+
<tr>
55+
<td>1</td>
56+
<td>4</td>
57+
<td>30</td>
58+
</tr>
59+
<tr>
60+
<td>2</td>
61+
<td>3</td>
62+
<td>10</td>
63+
</tr>
64+
<tr>
65+
<td>2</td>
66+
<td>4</td>
67+
<td>20</td>
68+
</tr>
69+
<tr>
70+
<td>3</td>
71+
<td>4</td>
72+
<td>20</td>
73+
</tr>
74+
</tbody>
75+
</table>
76+
77+
<p>이들 박스에 대하여 다음과 같이 배송하는 방법을 고려해 보자.</p>
78+
79+
<p>(1) 1번 마을에 도착하면</p>
80+
81+
<ul>
82+
<li>다음과 같이 박스들을 트럭에 싣는다. (1번 마을에서 4번 마을로 보내는 박스는 30개 중 10개를 싣는다.)</li>
83+
</ul>
84+
85+
<table class="table table-bordered" style="width:30%;">
86+
<thead>
87+
<tr>
88+
<th style="width: 10%;">보내는 마을</th>
89+
<th style="width: 10%;">받는 마을</th>
90+
<th style="width: 10%;">박스 개수</th>
91+
</tr>
92+
</thead>
93+
<tbody>
94+
<tr>
95+
<td>1</td>
96+
<td>2</td>
97+
<td>10</td>
98+
</tr>
99+
<tr>
100+
<td>1</td>
101+
<td>3</td>
102+
<td>20</td>
103+
</tr>
104+
<tr>
105+
<td>1</td>
106+
<td>4</td>
107+
<td>10</td>
108+
</tr>
109+
</tbody>
110+
</table>
111+
112+
<p>(2) 2번 마을에 도착하면</p>
113+
114+
<ul>
115+
<li>트럭에 실려진 박스들 중 받는 마을번호가 2인 박스 10개를 내려 배송한다. (이때 트럭에 남아있는 박스는 30개가 된다.)</li>
116+
<li>그리고 다음과 같이 박스들을 싣는다. (이때 트럭에 실려 있는 박스는 40개가 된다.)</li>
117+
</ul>
118+
119+
<table class="table table-bordered" style="width:30%;">
120+
<thead>
121+
<tr>
122+
<th style="width: 10%;">보내는 마을</th>
123+
<th style="width: 10%;">받는 마을</th>
124+
<th style="width: 10%;">박스 개수</th>
125+
</tr>
126+
</thead>
127+
<tbody>
128+
<tr>
129+
<td>2</td>
130+
<td>3</td>
131+
<td>10</td>
132+
</tr>
133+
</tbody>
134+
</table>
135+
136+
<p>(3) 3번 마을에 도착하면 </p>
137+
138+
<ul>
139+
<li>트럭에 실려진 박스들 중 받는 마을번호가 3인 박스 30개를 내려 배송한다. (이때 트럭에 남아있는 박스는 10개가 된다.)</li>
140+
<li>그리고 다음과 같이 박스들을 싣는다. (이때 트럭에 실려 있는 박스는 30개가 된다.)</li>
141+
</ul>
142+
143+
<table class="table table-bordered" style="width:30%;">
144+
<thead>
145+
<tr>
146+
<th style="width: 10%;">보내는 마을</th>
147+
<th style="width: 10%;">받는 마을</th>
148+
<th style="width: 10%;">박스 개수</th>
149+
</tr>
150+
</thead>
151+
<tbody>
152+
<tr>
153+
<td>3</td>
154+
<td>4</td>
155+
<td>20</td>
156+
</tr>
157+
</tbody>
158+
</table>
159+
160+
<p>(4) 4번 마을에 도착하면 </p>
161+
162+
<ul>
163+
<li>받는 마을번호가 4인 박스 30개를 내려 배송한다</li>
164+
</ul>
165+
166+
<p>위와 같이 배송하면 배송한 전체 박스는 70개이다. 이는 배송할 수 있는 최대 박스 개수이다.</p>
167+
168+
### 입력
169+
170+
<p>입력의 첫 줄은 마을 수 N과 트럭의 용량 C가 빈칸을 사이에 두고 주어진다. N은 2이상 2,000이하 정수이고, C는 1이상 10,000이하 정수이다. 다음 줄에, 보내는 박스 정보의 개수 M이 주어진다. M은 1이상 10,000이하 정수이다. 다음 M개의 각 줄에 박스를 보내는 마을번호, 박스를 받는 마을번호, 보내는 박스 개수(1이상 10,000이하 정수)를 나타내는 양의 정수가 빈칸을 사이에 두고 주어진다. 박스를 받는 마을번호는 보내는 마을번호보다 크다. </p>
171+
172+
### 출력
173+
174+
<p>트럭 한 대로 배송할 수 있는 최대 박스 수를 한 줄에 출력한다.</p>
175+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Foundation
2+
3+
let info = readLine()!.split(separator: " ").map({Int(String($0))!})
4+
let count = Int(readLine()!)!
5+
var nums = [[Int]]()
6+
var town = Array(repeating: 0, count: info[0])
7+
var answer = 0
8+
9+
for _ in 0..<count { nums.append(readLine()!.split(separator: " ").map({Int(String($0))!})) }
10+
11+
nums.sort {
12+
if $0[1] != $1[1] { return $0[1] < $1[1] }
13+
else { return $0[0] < $1[0] }
14+
}
15+
16+
for i in 0..<count {
17+
let max = (town[nums[i][0]-1..<nums[i][1]-1]).max()!
18+
if max < info[1] {
19+
let add = nums[i][2] + max > info[1] ? info[1] - max : nums[i][2]
20+
answer += add
21+
for j in nums[i][0]-1...nums[i][1]-2 {
22+
town[j] += add
23+
}
24+
}
25+
}
26+
27+
print(answer)

0 commit comments

Comments
 (0)