반응형
[백준 12015번] 가장 긴 증가하는 부분 수열 2 - Kotlin
https://www.acmicpc.net/problem/12015
https://github.com/citytexi/daily/pull/24
문제
- 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
- 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
- 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.
- 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
출력
- 첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
풀이
private class Solution12015 {
fun solution(
n: Int,
a: IntArray
): Int {
val result = mutableListOf(Int.MAX_VALUE)
for (i in a.indices) {
val current = a[i]
when {
result.last() < current -> result.add(current)
else -> result[binarySearch(current, result)] = current
}
}
return result.size
}
private fun binarySearch(
n: Int,
a: MutableList<Int>
): Int {
var left = 0
var right = a.lastIndex
while (right >= left) {
val mid = (left + right) / 2
when {
a[mid] == n -> return mid
a[mid] > n -> right = mid - 1
else -> left = mid + 1
}
}
return left
}
}
private fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val n = br.readLine().toInt()
val a = when (n) {
1 -> intArrayOf(br.readLine().toInt())
else -> br.readLine().split(" ").map(String::toInt).toIntArray()
}
bw.append("${Solution12015().solution(n, a)}\n")
bw.flush()
br.close()
bw.close()
}
반응형
'Software > 백준' 카테고리의 다른 글
[백준 1644번] 소수의 연속합 - Kotlin (1) | 2024.07.05 |
---|---|
[백준 1655번] 가운데를 말해요 - Kotlin (0) | 2024.06.03 |
[백준 1786번] 찾기 - Kotlin (0) | 2024.05.20 |
[백준 1005번] ACM Craft - Kotlin (0) | 2024.05.20 |
[백준 14003번] 가장 긴 증가하는 부분 수열 5 - Kotlin (0) | 2024.05.20 |