๋ด๊ฐ ์๋ ์ ๋ฐ์ด๋๋ฆฌ ์์น์ ๋ํด ์ฌ๋ฆฐ ์ ์ด ์๋ค.
์ด๋ฒ์ ๋ฌธ์ ํ์ด์์ ๋ฐ์ด๋๋ฆฌ ์์น์ ๋งค๊ฐ๋ณ์ ํ์์ ์ด์ฉํ๋ ๋ฌธ์ ๋ฅผ ํ๊ณ ๋ค์ ๊ฐ๋ ์ ๊ณต๋ถํด๋ณด๋ ค ํ๋ค.
์ด๋ถ ํ์ ๋ณต์ต(Binary Search)
์ด๋ถ ํ์์ ๊ฐ๋จํ๊ฒ ๋ณต์ต์ ํด๋ณด์.
์๋ gif์ ๋ณด๋ฉด ์ด๋ถ ํ์์ด ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ๋ฐ๋ก ์ดํด๋ฅผ ํ ์ ์์ ๊ฒ์ด๋ค.
์๋๊ฐ ์ผ๋ฐ ๊ฒ์ ๋ฐฉ๋ฒ์ด๊ณ ์๊ฐ ์ด๋ถ ํ์ ๋ฐฉ๋ฒ์ธ๋ฐ,
์ผ๋ฐ ํ์๊ณผ๋ ๋ค๋ฅด๊ฒ ์ค๊ฐ ์ง์ ๊ณผ ์์์ , ๋์ง์ ์ ์ ํด์ ์ค๊ฐ๊ฐ์ ์ฐพ์์ผ ํ๋ ๊ฐ๊ณผ ๋น๊ต ํ ๋์์ ๋ฐ๋ผ ๋ฒ์๋ฅผ ์ค์ฌ๊ฐ๋ฉด์ ํ์ํ๋ค.
์ด๋ถ ํ์์ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด์์ด์ผ ํ๋ค๋ ์ ์ด ํน์ง์ด๋ค.
์ค๊ฐ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋์๋ฅผ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์์ ์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฑธ๋ฌ๊ฐ๋ฉด์ ํ์ํ๊ธฐ ๋๋ฌธ์ ํ์ ์๊ฐ์ด ํจ๊ณผ์ ์ผ๋ก ์ค์ด๋ ๋ค.
๋งค๊ฐ ๋ณ์ ํ์(Parametric Search)
๋งค๊ฐ๋ณ์ ํ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต๋๊ฐ์ ๊ตฌํ ๋ ์ธ ์ ์๋ ํ์ ๋ฐฉ๋ฒ์ด๋ค.
๋งค๊ฐ๋ณ์ ํ์์ ์ด๋ถ ํ์์ ํตํด ์ต์ข ๋ต์์ ๊ฐ๊น์์ ธ ๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ด๋ถ ํ์์ mid์ ๊ฐ์ด ๋ฐ๋ก ์ ๋ต์ด ๋์ง๋ ์์ง๋ง, ์ ๋ต์ด ๋ ์ ์๋์ง ์๋์ง ์ฌ๋ถ๋ ํ๋จํ ์ ์๋ค.
์ด์ ๋ฌธ์ ๋ฅผ ํตํด ์์๋ณด์.
๋ฐฑ์ค์ ๋ํ์ ์ธ ๋งค๊ฐ ๋ณ์ ํ์ ๋ฌธ์ ์ธ ๋์ ์๋ฅด๊ธฐ ๋ฌธ์ ์ด๋ค.
๋์ ์๋ฅด๊ธฐ, Silver 2, 1654๋ฒ
๋ฌธ์ ์ค๋ช ์ ์๋ตํ๊ณ , ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํ์ด์ผ ํ๋์ง ์๋ ค ์ฃผ๊ฒ ๋ค.
๋์ ์ ์๋ผ์ ํ์ํ ๋์ ์ ๊ฐ์ N๊ฐ ์ด์์ด ๋ ์ ์๋ ์ต๋๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
๋จผ์ ์ด๋ถ ํ์์ ์ํ ๋ฒ์๋ฅผ ์ ์ฅํด ์ฃผ์ด์ผ ํ๋ค. ์ด์ฐจํผ ์ด๋ถ ํ์์ด ์๋ ๋นจ๋ผ์ 1๋ถํฐ ์ ๋ ฅ๋ฐ์ ์ต๋๊ฐ๊น์ง๋ก ์ค์ ํด๋ ๋๋ค.
์ฒ์์ 1์ start(left), ๊ฐ์ฅ ํฐ ๊ฐ์ธ 802๋ฅผ end(right), start์ end์ ์ค๊ฐ๊ฐ์ mid๋ก ์ค์ ํ๋ค.
์ฌ๊ธฐ์ mid๊ฐ์ด ์ ๋ต์ด ๋ ์ ์๋์ง ํ์ธํ๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง 802, 743, 457, 539๋ฅผ mid๊ฐ์ธ 401์ ๊ธธ์ด๋ก ์๋ผ๋ณด๋ฉด 2, 1, 1, 1๊ฐ๊ฐ ๋์ค๋๋ฐ ์ฐ๋ฆฌ์๊ฒ ํ์ํ ์์ธ 11๊ฐ(N)๋ณด๋ค 4๊ฐ๊ฐ ๋ถ์กฑํ๋ค.
์ฌ๊ธฐ์ 2๊ฐ์ง์ ์ฌ์ค์ ์ ์ ์๋ค.
401์ ์ ๋ต์ด ์๋ ๊ฒ(๊ฒฐ์ , ๋งค๊ฐ๋ณ์ ํ์).
401๋ณด๋ค ํฐ ๊ฐ๋ ์ ๋ต์ด ์๋(์ด๋ถ ํ์).
์ด์ฐจํผ 401๋ณด๋ค ์ปค ๋ดค์ ๊ฐ์๊ฐ ๋ ๋์ด๋์ง๋ ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๊ณ์ฐ 1๋ฒ์ผ๋ก ๋ฒ์จ ํ์ ๋ฒ์๋ฅผ 1 ~ 802์์ 1 ~ 400์ผ๋ก ์ ๋ฐ์ ์ค์๋ค.
๋ฐ๋ก ๋ค์ ๊ณ์ฐ์ ํด๋ณด์.
2๋ฒ์งธ ๊ณ์ฐ์์๋ ์ฒซ ๋ฒ์งธ์์ ์ ์ธ๋ ๊ฐ๋ค์ด ์๊ธฐ ๋๋ฌธ์ start(left), mid, end(right)๋ฅผ ์๋กญ๊ฒ ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค.
start๋ ๊ทธ๋๋ก ๋๊ณ , end๋ฅผ ์ฒซ ๊ณ์ฐ์ mid - 1(400)๋ก ๋ณ๊ฒฝํ๋ค. mid(401)์ ์ ๋ต์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
mid๊ฐ๋ ์๋ก ์ ํด์ง start์ end์ ๋ง๊ฒ ์๋ก ๊ตฌํด์ค๋ค.
๋ค์ mid๊ฐ ์ ๋ต์ด ๋ ์ ์๋์ง ํ์ธํ๋ค.
mid๊ฐ 200์ผ ๋๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง 802, 743, 457, 539์๋ค๊ฐ 200์ ๋๋ ๊ฐ์ ํฉ์ด 11์ธ๋ฐ ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฐ์ธ 11(N)์ด๋ ๊ฐ๋ค.
๊ทธ๋ฌ๋ฉด 200์ ์ ๋ต์ด ๋ ์ ์๋ค๋ ๋ป์ด ๋๋ค(์ ๋ต ํ์ ์๋).
์์ ์์ ๋ 200์ด ์ ๋ต์ด ๋ง๋ค(201๋ถํฐ๋ ๋๋ ํฉ์ด 10๊ฐ). ํ์ง๋ง ๋ค๋ฅธ ์ผ์ด์ค์์๋ 200์ด ์ต๋๊ฐ์ธ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ต์ด๋ผ๊ณ ํ์ ์ง์ง ์๊ณ ์ ๋ต์ผ ์ ์๋ ๊ฐ์ผ๋ก ๋๋๋ ๊ฒ์ด๋ค.
์ด ๊ณ์ฐ์ผ๋ก ๋ค์ ๋ฒ์๋ฅผ ๋ฐ์ผ๋ก ์ขํ ์ ์๋ค.
start๋ฅผ 200์ผ๋ก, end๋ฅผ 400์ผ๋ก ์ค์ ํ๊ณ mid๋ฅผ 300์ผ๋ก ์ค์ ํ๋ค.
์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด mid๊ฐ๊ณผ end๊ฐ์ด ๊ณ์ ๋ณ๋๋์ด ๊ฒฐ๊ณผ๋ก ์ด๋ฐ ๋ชจ์ต์ด ๋ ๊ฒ์ด๋ค.
์ด๋ก์ ๋ถ๋ถ์ด ์ ๋ต์ด ๋ ์ ์๋ ๋ถ๋ถ์ด๊ณ , ๋นจ๊ฐ์์ด ์ ๋ต์ด ์๋ ๋ถ๋ถ์ผ ๋, ๋จ์ ์ซ์๋ 201, 202๊ฐ ๋์ค๋๋ฐ 202์ 201 ๋ชจ๋ ๊ณ์ฐ์ ํด๋ณธ๋ค. ์์์ ์ธ๊ธํ๋ฏ์ด 201์ธ ๊ฒฝ์ฐ์๋ ๊ฐ์ด 10๊ฐ๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์ ์ต์ข ์ ์ธ ๋ต์ 200์ด ๋๋ ๊ฒ์ด๋ค.
์ด๋ก ์ ์ธ ๋ถ๋ถ์ ์ค๋ช ์ด ๋์์ผ๋ ์ฝ๋๋ก ์์๋ณด์.
ํต์ฌ ๋ถ๋ถ์ธ ํ์ ์ฝ๋๋ง ๋ณด์ฌ์ฃผ๊ฒ ๋ค.
์ฐ์ main์ ํ์ ํจ์๋ฅผ ์คํํ๋ค. start์ ์ด๊ธฐ๊ฐ์ 1, end์ ์ด๊ธฐ๊ฐ์ ์ ๋ ฅ๊ฐ์ ์ต๋๊ฐ(max), mid๋ max / 2๋ก ์ค์ ํ๋ค.
binarySearch(1, max / 2, max)
binarySearch ํจ์์์๋
mid๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฅ๊ฐ์ ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฐ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ฌ๊ท ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํด ์ฃผ์๋ค.
var cut = 0
for (i in 0 until lan.size) {
cut += lan[i] / mid
}
cut์ด ๊ตฌํด์ผ ํ๋ ์(cnt) ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด mid๋ฅผ ๊ธฐ์ค์ผ๋ก end๊น์ง์ ๊ฐ๋ค์ด ๋ชจ๋ ์ ๋ต์ด ๋ ์ ์๋ค.
๊ทธ ์ฌ์ค์ ๊ณ ๋ คํด์ start, mid, end๋ฅผ ์ค์ ํด ์ฃผ๊ณ ์ฌ๊ท๋ฅผ ๋๋ฆฐ๋ค.
// ์๋ฅธ ๊ฐ(cut)์ด ๊ตฌํด์ผ ํ๋ ์(cnt)๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด mid๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ ์ ๊ฐ๋ค์ ๋ชจ๋ ์ ๋ต์ด ์๋๊ฒ ๋๋ค.
if (cut >= cnt) {
// mid ์ดํ์ ๊ฐ์ผ๋ก ๋ฒ์๋ฅผ ๋ค์ ์ค์ ํด ์ฌ๊ท ํจ์ ํธ์ถ
binarySearch(mid, mid + (end - mid) / 2, end)
}
cut์ด ๊ตฌํด์ผ ํ๋ ์(cnt) ๋ณด๋ค ์์ผ๋ฉด start๋ถํฐ mid๊น์ง์ ๊ฐ๋ค์ด ์ ๋ต์ด ๋ ์ ์๋ค.
// ์๋ฅธ ๊ฐ(cut)์ด ๊ตฌํด์ผ ํ๋ ์(cnt)๋ณด๋ค ์์ ๊ฒฝ์ฐ mid๋ฅผ ๊ธฐ์ค์ผ๋ก ์ดํ์ ๊ฐ๋ค์ ๋ชจ๋ ์ ๋ต์ด ์๋๊ฒ ๋๋ค.
else {
// mid ์ด์ ์ ๊ฐ์ผ๋ก ๋ฒ์๋ฅผ ๋ค์ ์ค์ ํด ์ฌ๊ท ํจ์ ํธ์ถ
binarySearch(start, start + (mid - start) / 2, mid)
}
์ฌ๊ท๋ฅผ ๋ฐ๋ณตํ๋ค ๋ณด๋ฉด start์ mid๊ฐ ๊ฐ์์ง๋ ์์ ์ด ์ค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด start(mid)์ end ์ด 2๊ฐ์ ๊ฐ์ด ๋จ๊ฒ ๋๋๋ฐ, ์ต๋๊ฐ์ ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ start(mid) ๋ณด๋ค ํฐ ๊ฐ์ธ end๋ฅผ ์ด์ฉํด cut์ ๊ตฌํด๋ณธ๋ค.
๋ง์ฝ end๋ฅผ ์ด์ฉํ resultCut์ด ๊ตฌํด์ผ ํ๋ ์๋ณด๋ค ์์ผ๋ฉด ์ต์ข ๋ต์ start(mid)๊ฐ ๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด end๊ฐ ๋ ๊ฒ์ด๋ค.
if (start >= mid) {
var resultCut = 0
for (i in 0 until lan.size) {
resultCut += lan[i] / end
}
if (resultCut < cnt) println(start)
else println(end)
return
}
๊ตฌํ ์ค ์ฃผ์ํ ์
๋งค๊ฐ ๋ณ์ ํ์(์ด๋ถ ํ์)์ ์ฒ์ ๊ตฌํํ ๋๋ start, mid, end์ ๊ฐ์ ์ด๋ป๊ฒ ๋ณ๊ฒฝํด์ผ ํ ์ง ํผ๋์ด ์ฌ ์ ์๋ค.
์ฒ์ฒํ ์๊ฐํด ๋ณผ ํ์ ์๋ ๊ฐ๋ค์ ์ ๋ฒ๋ ค์ ๋ชจ๋ ๋งค๊ฐ ๋ณ์ ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณด์.
์ถ์ฒ
https://adjh54.tistory.com/187
[Java/์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์(Binary Search) ์ดํดํ๊ธฐ
ํด๋น ๊ธ์์๋ ์๊ณ ๋ฆฌ์ฆ ์ค ์ด์ง/์ด๋ถ ํ์์ ๋ํด์ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์์ฑํ ๊ธ์ ๋๋ค. 1) ์ด์ง ํ์(Binary Search)๐ก ์ด์งํ์(Binary Search)์ด๋?- ‘์ ๋ ฌ๋ ๋ฐฐ์ด’์์ ‘ํน์ ๊ฐ’์ ์ฐพ๋ ์
adjh54.tistory.com
https://sete3683.tistory.com/50
๋งค๊ฐ ๋ณ์ ํ์(parametric search, ํ๋ผ๋ฉํธ๋ฆญ ์์น)
๋งค๊ฐ ๋ณ์ ํ์์ ์ต์ ํ ๋ฌธ์ ๋ฅผ ๊ฒฐ์ ๋ฌธ์ ๋ก ๋ฐ๊พธ์ด ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฒ์ด๋ผ๊ณ ํ๋ค. ์ต์ ํ ๋ฌธ์ ๋ ๋ง๊ทธ๋๋ก ์ด๋ ํ ํจ์๊ฐ์ ์ต์ ํ์ํค๋ ๋ณ์๋ฅผ ์ฐพ๋ ๋ฌธ์ , ๊ทธ๋ฆฌ๊ณ ๊ฒฐ์ ๋ฌธ์ ๋ ์-์
sete3683.tistory.com
'๐ | Kotlin > ๐ค | ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋งค๋ด์ฒ ์๊ณ ๋ฆฌ์ฆ(Manacher) ๊ฐ๋ (0) | 2024.06.24 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ(DFS, BFS) (0) | 2024.06.22 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm) (0) | 2024.06.18 |
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2024.06.12 |
[Kotlin] ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ ์๊ณ ๋ฆฌ์ฆ (0) | 2022.10.24 |