https://www.acmicpc.net/problem/1654
정답 코드
class Lan{
var N = 0L
var K = 0L
lateinit var lans: MutableList<Long>
fun solution(){
var (k, n) = readln().split(" ").map{ it.toLong() }
N = n
K = k
lans = mutableListOf()
var maxLan = 0L
for(i in 0 until K) {
var num = readln().toLong()
maxLan = maxOf(maxLan, num)
lans.add(num)
}
var start = 1L
var end = maxLan + 1
var answer = 0L
while(start <= end){
var mid = ((start + end) / 2)
var slicedLan = lanSlice(mid)
if (slicedLan >= N){
answer = maxOf(mid, answer)
start = mid + 1
} else {
end = mid - 1
}
}
println(answer)
}
fun lanSlice(div: Long): Long {
var result = 0L
lans.forEach{it->
result += (it/div)
}
return result
}
}
fun main(){
var S = Lan()
S.solution()
}
오류 해결 과정
제출 시 오류가 나서 그것을 해결하느라 쉽지 않았다.
오류가 났었던 이유
1. "N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다"
문제에서 "N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다" 라는 것을 보지 못하고, 딱 N개만 만들어야 한다고 생각했다.
그래서 while 문 안에 코드를 아래와 같이 랜선의 갯수가 N개와 동일한 경우만 더했다.
// 수정 전
if(slicedLan == N){
answer = maxOf(mid, answer)
start = mid + 1
} else if (slicedLan > N){
start = mid + 1
} else {
end = mid - 1
}
// 수정 후
if (slicedLan >= N){
answer = maxOf(mid, answer)
start = mid + 1
} else {
end = mid - 1
}
2. 런타임 에러 (/by zero)
처음에 start = 0 이라고 하고 시작했다. 이렇게 하면 mid가 0이 될 가능성이 있다. 그래서 lanSlice() 함수에서 div 가 0이 되어 0으로 나누게 된다.
그래서 start =1L 로 수정하였다.
3. Type
모든 변수를 Int로 정의 했는데,
mid 를 구하는 방법이 (max + min ) / 2 이며,
입력 상, max 와 min 을 합칠 때 Int 를 초과할 수 있으므로
Long 을 써주어야 한다.
728x90
'코테 > 코딩테스트 대비 Kotlin' 카테고리의 다른 글
백준 1309 동물원 Kotlin (0) | 2023.08.23 |
---|---|
백준 1149 RGB거리 DP Kotlin (0) | 2023.08.23 |
백준 13023 ABCDE Kotlin dfs (0) | 2023.08.21 |
백준 2606 바이러스 Kotlin Dfs (0) | 2023.08.20 |
백준 미로탐색 Kotlin Bfs (0) | 2023.08.20 |