알고리즘/이진 탐색
백준 1654번 랜선자르기 - kotlin
의탕
2020. 11. 4. 16:28
오늘은 이진탐색 문제중 랜선 자르기 라는 문제를 풀어보았다
19%라는 낮은 정답률을 가진 난이도 있어보이는 문제였고, 과감히 도전하였다
문제
접근방법
MIN값과 가장 긴 랜선의 길이를 MAX값으로 잡고 두 값을 더해 2로 나눈 MID값으로 이진탐색
여기서 중요한 부분은 min,max값을 Long타입으로 선언해주는 것이다
그 이유는 랜선의 길이가 최대 2의 32제곱까지 가능하고, mid를 구하기위해 min과 max의 값을 더해주는 과정에서 Int의 범위를 벗어나기때문에 Long으로 선언해야한다.
풀이소스
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val (K, N) = readLine().split(" ").map { it.toInt() }
val arr = Array(K, { 0 })
var min: Long = 1 //최소값
var max: Long //최대값
var mid: Long //중간값
//랜선 길이 입력
for (i in 0 until K) {
arr[i] = readLine().toInt()
}
arr.sort() //정렬
max = arr[K - 1].toLong() //최대값을 어레이의 마지막값으로 세팅
while (min <= max) {
//중간값( 랜선을 나눌 기준 길이 )
mid = (min + max) / 2
//랜선의 갯수
var count:Long = 0
for (i in 0 until K) {
count += arr[i] / mid // 랜선길이/기준길이 의 몫 만큼 카운트 증가
}
if (count >= N) { //목표개수보다 같거나 크면
min = mid + 1 //최소값 재설정
} else max = mid - 1 //아니면 최대값 재설정
}
print(max)
}
위 사진처럼 런타임에러가 자꾸나서 뭐 때문인지... 삽질을 엄청했다..
하지만 결국 답을 찾아냈고 그 이유는 Long 타입을가진 min변수를 0으로 초기화 했기 때문이었다.
Long이 0이 되는걸로 알고있는데 왜 이러는지 잘 모르겠다. 한번 찾아봐야겠다.