Skip to content

Commit a2f6f24

Browse files
committed
[Gold II] Title: 꼬인 전깃줄, Time: 48 ms, Memory: 76880 KB -BaekjoonHub
1 parent 9660138 commit a2f6f24

2 files changed

Lines changed: 67 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 II] 꼬인 전깃줄 - 1365
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1365)
4+
5+
### 성능 요약
6+
7+
메모리: 76880 KB, 시간: 48 ms
8+
9+
### 분류
10+
11+
이분 탐색, 가장 긴 증가하는 부분 수열 문제
12+
13+
### 제출 일자
14+
15+
2025년 11월 1일 13:48:44
16+
17+
### 문제 설명
18+
19+
<p>공화국에 있는 유스타운 시에서는 길을 사이에 두고 전봇대가 아래와 같이 두 줄로 늘어서 있다. 그리고 길 왼편과 길 오른편의 전봇대는 하나의 전선으로 연결되어 있다. 어떤 전봇대도 두 개 이상의 다른 전봇대와 연결되어 있지는 않다.</p>
20+
21+
<p style="text-align: center;"><img alt="" src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/upload/201004/picpicpicpicpicpicpicp.JPG" style="height:181px; width:141px"></p>
22+
23+
<p>문제는 이 두 전봇대 사이에 있는 전깃줄이 매우 꼬여 있다는 점이다. 꼬여있는 전깃줄은 화재를 유발할 가능성이 있기 때문에 유스타운 시의 시장 임한수는 전격적으로 이 문제를 해결하기로 했다.</p>
24+
25+
<p>임한수는 꼬여 있는 전깃줄 중 몇 개를 적절히 잘라 내어 이 문제를 해결하기로 했다. 하지만 이미 설치해 놓은 전선이 아깝기 때문에 잘라내는 전선을 최소로 하여 꼬여 있는 전선이 하나도 없게 만들려고 한다.</p>
26+
27+
<p>유스타운 시의 시장 임한수를 도와 잘라내야 할 전선의 최소 개수를 구하는 프로그램을 작성하시오.</p>
28+
29+
### 입력
30+
31+
<p>첫 줄에 전봇대의 개수 N(1 ≤ N ≤ 100,000)이 주어지고, 이어서 N보다 작거나 같은 자연수가 N개 주어진다. i번째 줄에 입력되는 자연수는 길 왼쪽에 i번째 전봇대와 연결된 길 오른편의 전봇대가 몇 번 전봇대인지를 나타낸다.</p>
32+
33+
### 출력
34+
35+
<p>전선이 꼬이지 않으려면 최소 몇 개의 전선을 잘라내야 하는 지를 첫째 줄에 출력한다.</p>
36+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
let n = Int(readLine()!)!
2+
let arr = readLine()!.split { $0 == " " }.map { Int(String($0))! }
3+
var answer = 0
4+
var lis = [arr[0]]
5+
6+
// 즉 lis를 만족하기 위해 몇개의 수를 스킵해야 하냐는 문제. 전선을 잘라내야 하냐는 문제.
7+
8+
for x in arr.dropFirst() {
9+
let index = lowerBound(x, lis)
10+
if lis.count == index {
11+
lis.append(x)
12+
continue
13+
}
14+
lis[index] = x
15+
}
16+
print(arr.count - lis.count)
17+
18+
func lowerBound(_ x: Int, _ arr: [Int]) -> Int {
19+
var lo = 0, hi = arr.count
20+
21+
while lo < hi {
22+
let mid = (lo + hi) / 2
23+
if arr[mid] < x {
24+
lo = mid + 1
25+
continue
26+
}
27+
hi = mid
28+
}
29+
30+
return lo
31+
}

0 commit comments

Comments
 (0)