[백준 1920][Kotlin] 수 찾기
Updated:
문제 링크
https://www.acmicpc.net/problem/1920
코드
fun main() {
val n = readln().toInt()
val list = readln().split(' ').map{it.toInt()}.sorted() // 이진 탐색을 위해 오름차순 정렬
val m = readln().toInt()
val itemList = readln().split(' ').map{it.toInt()}
for (i in 0 until m) { // 이진 탐색
var low = 0
var high = n-1
var mid: Int = 0
var valid = false
while (low <= high) {
mid = (low+high)/2
when {
itemList[i] == list[mid] -> {
valid = true
break // 바깥 while에 적용됨
}
itemList[i] > list[mid] -> {
low = mid+1
}
else -> {
high = mid-1
}
}
}
if (valid)
println("1")
else
println("0")
}
}
설명
수를 하나씩 대소 비교하는 것은 O(N제곱)이 걸리는데 이는 시간제한(1초)를 초과하므로 리스트의 요소를 오름차순 정렬하고 이진탐색을 통해 풀었다.
후기
이진 탐색일 때 시간 복잡도는 O(logN)이다. 이를 기억하고 부루트포스와 이진탐색 중 하나를 결정하자. 사실 정렬만 O(N)로 할 수 있다면 수 대소 비교를 통한 탐색은 이진탐색으로 하는 것이 효율이 훨씬 좋다.
Leave a comment