문제
https://www.acmicpc.net/problem/12015
12015번: 가장 긴 증가하는 부분 수열 2
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
풀이
O(nlogn) 안에 풀어야 하는 문제이다.
nlogn으로 풀어야 하기에 이진 탐색을 추가했다.
가장 먼저 수열이 담긴 배열을 seq이라 하고,
dp 배열을 만들어주는데 dp[i]의 경우에는 i의 길이의 증가하는 수열의 가장 끝의 값이 담겨있다.
코드
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
lateinit var dp : MutableList<Int>
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.`out`))
val N = br.readLine().toInt()
val seq = mutableListOf<Int>(0)
seq.addAll(br.readLine().split(" ").map { it.toInt() })
dp = MutableList(N+1){0}
var depth = 1
for(i in 1 until seq.size) {
val idx = binarySearch(0, depth-1, seq[i])
if(idx == -1) {
dp[depth] = seq[i]
depth++
}
else dp[idx] = seq[i]
}
bw.write((depth-1).toString())
bw.flush()
bw.close()
}
fun binarySearch(start : Int, end : Int, find: Int) : Int {
val mid : Int = (start + end) / 2
if(start > end) return -1
if(dp[mid] < find && find <= dp[mid+1]) return mid + 1
if(dp[mid] >= find) return binarySearch(start, mid-1, find)
if(dp[mid] < find) return binarySearch(mid+1, end, find)
return -1
}
'백준' 카테고리의 다른 글
백준 [12100] kotlin (0) | 2023.07.19 |
---|---|
백준 [27172] kotlin (0) | 2023.07.18 |
백준 [2166] kotlin (0) | 2023.07.17 |
백준 - 자동으로 github에 백준 문제 커밋하기 (0) | 2023.01.17 |
백준 [22333] kotlin (0) | 2023.01.10 |