์ ๊ตญ์ฌ์ฌ
Level 3
https://school.programmers.co.kr/learn/courses/30/lessons/43238?language=kotlin
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
์ด๋ถ ํ์์ ์ด์ฉํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
์ด๋์ ์ด๋ถ ํ์์ ์จ์ผ ํ ๊น?
n๋ช ์ ๊ฒ์ฌํ๋ ๋ฐ ์ด ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ด๋ถ ํ์์ ์งํํด์ผ ํ๋ค.
์ด ๊ฑธ๋ฆฐ ์๊ฐ์ ์ด๋ป๊ฒ ๊ตฌํ ์ ์์๊น?
์์ 1์์๋ n = 6์ด๊ณ , ์ฌ์ฌ๊ด์ด ๊ฒ์ฌํ๋ ๋ฐ ๋๋ ์๊ฐ 10์ด, 7์ด์ด๊ณ ๊ฑธ๋ฆฐ ์๊ฐ์ด 28์ด์ด๋ค.
28์ด๊ฐ ๋์ค๊ธฐ ์ํด์๋ 7์ด ๊ฑธ๋ฆฌ๋ ์ฌ์ฌ๊ด์ด 4๋ช ์ ๊ฒ์ฌํ๊ณ , 10์ด ๊ฑธ๋ฆฌ๋ ์ฌ์ฌ๊ด์ด 2๋ช ์ ๊ฒ์ฌํ๋ฉด ๋ฑ 6๋ช ์ด ๋ผ์ ๊ฒ์ฌ๋ฅผ ๋๋ผ ์ ์๋ค.
์ด ์ฌ์ค๋ก ๋ค์๊ณผ ๊ฐ์ ๊ณต์์ ์ ์ฉํ ์ ์๋ค.
28 / 4 + 28 / 10 = 6
๊ฑธ๋ฆฐ ์๊ฐ์ ๊ฐ ์ฌ์ฌ๊ด์ ๊ฒ์ฌ์๊ฐ์ ๋๋๊ณ ๋๋จธ์ง๋ ๋ฒ๋ฆฐ ๊ฐ์ ํฉ์ด n๊ณผ ๊ฐ์์ผ ์ ํํ ์ด ๊ฒ์ฌ์๊ฐ์ด ๋์จ๋ค.
์ด๋ฅผ ์ด์ฉํด ์ด๋ถ ํ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ณด๊ฒ ๋ค.
์ด๋ถ ํ์์๋ ์์์ ๊ณผ ์ข ๋ฃ์ ์ด ์๋ค.
์์์ ์ 0์ผ๋ก ํ๊ณ , ์ข ๋ฃ์ ์ n๋ช ์ด ๊ฒ์ฌ๋ฐ์์ ๋, ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ฌ ์๊ฐ์ผ๋ก ์ค์ ํ๋ฉด ๋๋ค.
๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ตฌํ๋ ค๋ฉด ๊ฐ์ฅ ๊ฒ์ฌ๊ฐ ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฌ์ฌ๊ด์ ๊ฒ์ฌ ์๊ฐ์ n์ ๊ณฑํ๋ฉด ๋๋ค.
binarySearch(0, examiner.last() * people)
<์กฐ๊ฑด 1>
๋ค์์ผ๋ก ์ด๋ถ ํ์์ ์งํํ๋ฉด์ ์์์ ๊ณผ ์ข ๋ฃ์ ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ์ด๋ค.
์์์ ์ด ๋ณ๊ฒฝ๋๋ ค๋ฉด mid(ํ์ฌ ๊ฒ์ฌ ์๊ฐ)๋ฅผ ์ด์ฉํด ๊ฒ์ฌํ ์ ์๋ ์ฌ๋๋ค์ด n๋ณด๋ค ์ ์ ๊ฒฝ์ฐ์๋ ์์์ ์ mid + 1๋ก ๋ณ๊ฒฝํด ํ์ ๋ฒ์๋ฅผ ์ขํ ์ ์๋ค.
val mid = (end + start) / 2L
val res = examiner.sumOf { mid / it }
if (res < people)
<์กฐ๊ฑด 2>
๋ง์ฝ mid๋ฅผ ์ด์ฉํด ๊ฒ์ฌํ ์ ์๋ ์ฌ๋์ด n๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ข ๋ฃ์ ์ ์ค์ฌ์ ๊ฒ์ ๋ฒ์๋ฅผ ์ขํ์ผ ํ๋ค. ์ข ๋ฃ์ ์ mid - 1๋ก ๋ณ๊ฒฝํ๋ค. ์ด์ฐจํผ mid ์ดํ์ ๊ฐ๋ค๋ ๋ชจ๋ ๊ฒ์ฌํ ์ ์๋ ์ฌ๋์ด n๋ณด๋ค ํด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
n๊ณผ mid๋ก ๊ฒ์ฌํ ์ ์๋ ์ฌ๋์ ์๊ฐ ๊ฐ์์ผ ์ ๋ต์ด ๋๋ค.
์ด ์กฐ๊ฑด์ ๋ค์ด์ค๋ฉด ์ ๋ต ํ๋ณด๊ฐ ๋์ด answer์ ์ ์ฅ๋๋ค. ํ์ง๋ง answer๊ฐ ๋ฐ๋ ์๋ ์๋ค.
else {
answer = mid
binarySearch(start, mid - 1)
}
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
private var examiner = listOf<Long>()
private var people = 0
private var answer: Long = 0
fun solution(n: Int, times: IntArray): Long {
times.sort()
examiner = times.map { it.toLong() }
people = n
binarySearch(0, examiner.last() * people)
println(answer)
return answer
}
private fun binarySearch(start: Long, end: Long) {
if (start > end) return
val mid = (end + start) / 2L
val res = examiner.sumOf { mid / it }
if (res < people) {
binarySearch(mid + 1, end)
} else {
answer = mid
binarySearch(start, mid - 1)
}
}
๋ฌธ์ ํ์ด
times๋ฅผ ์ ๋ ฌํ ๊ฐ์ examiner์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ binarySearch ํจ์๋ฅผ ์ํํ๋ค.
binarySearch๋ end๊ฐ start๋ณด๋ค ์์์ง๋ค๋ฉด ์ข ๋ฃ๋๋ค.
end์ start์ ์ค๊ฐ๊ฐ์ธ mid๋ฅผ ์์ฑํ๋ค. mid๊ฐ ์ด ๊ฑธ๋ฆฐ ์๊ฐ์ด ๋ ๊ฒ์ด๋ค.
examiner์ mid๋ฅผ ์ด์ฉํด mid๋ถ ๋์ ๊ฒ์ฌํ ์ ์๋ ์ฌ๋์ด ๋ช ๋ช ์ธ์ง ๊ตฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด 1์ ๋ง์กฑํ๋ค๋ฉด start์ ๋ฒ์๋ฅผ mid + 1๋ก ์ค์ ํ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด ์กฐ๊ฑด 2๋ฅผ ์ ์ฉํด end๋ฅผ mid - 1๋ก ์ค์ ํ๊ณ ์ฌ๊ทํ๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
search๋ฅผ ํ๊ธฐ ์ํด ์ด๋ค ๊ฒ์ ์จ์ผ ํ ์ง ๊ฐ์ด ์กํ์ง ์์์ ์ ๊ทผ๋ฒ์ ์ฐพ์์ ํด๊ฒฐํ์๋ค.
๊ฑธ๋ฆฐ ์๊ฐ์ ๊ฒ์ํ๋ ๊ฒ๊ณผ ๊ฑธ๋ฆฐ ์๊ฐ๊ณผ ๊ฒ์ฌ ์๊ฐ์ผ๋ก ๊ฒ์ฌํ ์ ์๋ ์ฌ๋์ด ๋ช ๋ช ์ธ์ง ๊ตฌํ ์ ์๋ค๋ ์ฌ์ค๋ ์๊ฒ ๋์๋ค.
'๐ | ํ๋ก๊ทธ๋๋จธ์ค > ๐ | Level 3' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, Lv.3] ํ๋ก๊ทธ๋๋จธ์ค ๋คํธ์ํฌ (0) | 2024.08.06 |
---|---|
[Kotlin, Lv.3] ํ๋ก๊ทธ๋๋จธ์ค ๋ฒ ์คํธ์จ๋ฒ (0) | 2024.07.31 |