Skip to content

Commit 7d4ec9e

Browse files
committed
[Gold IV] Title: 휴게소 세우기, Time: 8 ms, Memory: 79516 KB -BaekjoonHub
1 parent a14bd08 commit 7d4ec9e

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold IV] 휴게소 세우기 - 1477
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1477)
4+
5+
### 성능 요약
6+
7+
메모리: 79516 KB, 시간: 8 ms
8+
9+
### 분류
10+
11+
이분 탐색, 매개 변수 탐색
12+
13+
### 제출 일자
14+
15+
2025년 10월 26일 21:10:12
16+
17+
### 문제 설명
18+
19+
<p>다솜이는 유료 고속도로를 가지고 있다. 다솜이는 현재 고속도로에 휴게소를 N개 가지고 있는데, 휴게소의 위치는 고속도로의 시작으로부터 얼만큼 떨어져 있는지로 주어진다. 다솜이는 지금 휴게소를 M개 더 세우려고 한다.</p>
20+
21+
<p>다솜이는 이미 휴게소가 있는 곳에 휴게소를 또 세울 수 없고, 고속도로의 끝에도 휴게소를 세울 수 없다. 휴게소는 정수 위치에만 세울 수 있다.</p>
22+
23+
<p>다솜이는 이 고속도로를 이용할 때, 모든 휴게소를 방문한다. 다솜이는 휴게소를 M개 더 지어서 휴게소가 없는 구간의 길이의 최댓값을 최소로 하려고 한다. (반드시 M개를 모두 지어야 한다.)</p>
24+
25+
<p>예를 들어, 고속도로의 길이가 1000이고, 현재 휴게소가 {200, 701, 800}에 있고, 휴게소를 1개 더 세우려고 한다고 해보자.</p>
26+
27+
<p>일단, 지금 이 고속도로를 타고 달릴 때, 휴게소가 없는 구간의 최댓값은 200~701구간인 501이다. 하지만, 새로운 휴게소를 451구간에 짓게 되면, 최대가 251이 되어서 최소가 된다.</p>
28+
29+
### 입력
30+
31+
<p>첫째 줄에 현재 휴게소의 개수 N, 더 지으려고 하는 휴게소의 개수 M, 고속도로의 길이 L이 주어진다. 둘째 줄에 현재 휴게소의 위치가 공백을 사이에 두고 주어진다. N = 0인 경우 둘째 줄은 빈 줄이다.</p>
32+
33+
### 출력
34+
35+
<p>첫째 줄에 M개의 휴게소를 짓고 난 후에 휴게소가 없는 구간의 최댓값의 최솟값을 출력한다.</p>
36+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import Foundation
2+
3+
let nml = readLine()!.split { $0 == " " }.map { Int($0)! },
4+
n = nml[0],
5+
m = nml[1],
6+
l = nml[2]
7+
8+
let posList = n != 0 ? [0] + readLine()!.split { $0 == " " }.map { Int($0)! }.sorted { $0 < $1 } + [l] : [0, l]
9+
10+
var start = 1
11+
var end = l
12+
var answer = 0
13+
14+
while start <= end {
15+
let mid = (start + end) / 2
16+
let shouldInstallCount = restCount(mid)
17+
// 지을 수 있는 휴게소가 m과 같거나 더 적다면, 거리를 늘려본다.
18+
if shouldInstallCount <= m {
19+
answer = mid
20+
// 최솟값 줄이기
21+
end = mid - 1
22+
continue
23+
}
24+
//최솟값 키우기
25+
start = mid + 1
26+
}
27+
28+
print(answer)
29+
30+
// 휴게소가 더 많이 지어진다는건, 실재 최소 거리가 distance보다 크다.
31+
// 즉 distance를 늘려야 한다.
32+
// 휴게소가 적다는 건, 실재 최소 거리가 distance보다 작다는 뜻.
33+
// 즉 distance를 줄여야 한다.
34+
35+
func restCount(_ distance: Int) -> Int {
36+
var count = 0
37+
for i in 1..<posList.count {
38+
let gap = posList[i] - posList[i - 1]
39+
count += (gap - 1) / distance
40+
}
41+
return count
42+
}

0 commit comments

Comments
 (0)