Skip to content

Commit 78126df

Browse files
committed
[Gold II] Title: 반도체 설계, Time: 24 ms, Memory: 72504 KB -BaekjoonHub
1 parent 84e2923 commit 78126df

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# [Gold II] 반도체 설계 - 2352
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2352)
4+
5+
### 성능 요약
6+
7+
메모리: 72504 KB, 시간: 24 ms
8+
9+
### 분류
10+
11+
이분 탐색, 가장 긴 증가하는 부분 수열 문제
12+
13+
### 제출 일자
14+
15+
2025년 11월 1일 13:54:02
16+
17+
### 문제 설명
18+
19+
<p>반도체를 설계할 때 n개의 포트를 다른 n개의 포트와 연결해야 할 때가 있다.</p>
20+
21+
<p style="text-align: center;"><img alt="" src="https://www.acmicpc.net/JudgeOnline/upload/201103/chip.png" style="height:235px; width:567px"></p>
22+
23+
<p>예를 들어 왼쪽 그림이 n개의 포트와 다른 n개의 포트를 어떻게 연결해야 하는지를 나타낸다. 하지만 이와 같이 연결을 할 경우에는 연결선이 서로 꼬이기 때문에 이와 같이 연결할 수 없다. n개의 포트가 다른 n개의 포트와 어떻게 연결되어야 하는지가 주어졌을 때, 연결선이 서로 꼬이지(겹치지, 교차하지) 않도록 하면서 최대 몇 개까지 연결할 수 있는지를 알아내는 프로그램을 작성하시오</p>
24+
25+
### 입력
26+
27+
<p>첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주어진다. 이 수들은 1 이상 n 이하이며 서로 같은 수는 없다고 가정하자.</p>
28+
29+
### 출력
30+
31+
<p>첫째 줄에 최대 연결 개수를 출력한다.</p>
32+
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
let n = Int(readLine()!)!
2+
let arr = readLine()!.split { $0 == " " }.map { Int(String($0))! }
3+
var lis = [arr[0]]
4+
5+
// 즉 lis를 만족하기 위해 몇개의 수를 스킵해야 하냐는 문제. 전선을 잘라내야 하냐는 문제.
6+
7+
for x in arr.dropFirst() {
8+
let index = lowerBound(x, lis)
9+
if lis.count == index {
10+
lis.append(x)
11+
continue
12+
}
13+
lis[index] = x
14+
}
15+
print(lis.count)
16+
17+
func lowerBound(_ x: Int, _ arr: [Int]) -> Int {
18+
var lo = 0, hi = arr.count
19+
20+
while lo < hi {
21+
let mid = (lo + hi) / 2
22+
if arr[mid] < x {
23+
lo = mid + 1
24+
continue
25+
}
26+
hi = mid
27+
}
28+
29+
return lo
30+
}

0 commit comments

Comments
 (0)