์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)
์ค๋์ ํ์ ์๊ณ ๋ฆฌ์ฆ ์ค ์ด์ง ํ์(Binary Search)์ด ๋ฌด์์ธ์ง ์์๋ณด๊ณ Swift ์ฝ๋๋ก ๊ตฌํ๊น์ง ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ ํ์์ ๋ฒ์๊ฐ ์์ฃผ ํฐ ์ํฉ์์ ์๋๋ฅผ ๋ด์ ํ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ ์ ์ ๋ฆฌํด๋๋ฉด ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ก ์์ํด๋ณผ๊ฒ์!
์ด์ง ํ์์ด๋?
๋จผ์ , ์ด์ง ํ์์ด ์ ํ์ํ ๊น์?? ๋ฆฌ์คํธ ๋ด์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ์ ๋ฐฉ๋ฒ์ธ ์์ฐจ ํ์ ๋ฐฉ๋ฒ๊ณผ ๋น๊ตํ๋ฉฐ ์ด์ง ํ์์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋ํด ์์๋ด ์๋ค.
์์ฐจ ํ์
์์ฐจ ํ์์ด๋ ๋ฆฌ์คํธ ์์ ์๋ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ฐจ๋ก๋๋ก ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ณดํต ์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ผ ํ ๋ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๋ฆฌ์คํธ ๋ด์ ๋ฐ์ดํฐ๊ฐ ์๋ฌด๋ฆฌ ๋ง์๋ ์๊ฐ๋ง ์ถฉ๋ถํ๋ค๋ฉด ํญ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ํ, ์์ฐจ ํ์์ ๊ฐ์ฅ ์์ ์๋ ์์๋ถํฐ ํ๋์ฉ ์ฐจ๋ก๋ก ํ์ธํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ ๋ ฌ ์ฌ๋ถ์ ์๊ด์์ด ํญ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋งค์ฐ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค๋ ์ฅ์ ๋ ์์ต๋๋ค.
ํ์ง๋ง, ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N๊ฐ ์ผ ๋ ์ต๋ N๋ฒ์ ๋น๊ต ์ฐ์ฐ์ด ํ์ํ๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(N)์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์์ ๋ฒ์๊ฐ ์์ฃผ ํฐ ์ํฉ์ด๋ผ๋ฉด ๋จ์ํ ์์์ ๋ถํฐ ํ๋์ฉ ๋น๊ตํด๋๊ฐ๋ ๋ฐฉ๋ฒ์ ์๊ฐ์ด ๋งค์ฐ ๋ง์ด ์์๋ ์ ์์ผ๋ฏ๋ก ๋ ํจ์จ์ ์ธ ํ์ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค!
์ด์ง ํ์
์ด์ ์์ฐจ ํ์๋ณด๋ค ํจ์ฌ ๋ ํจ์จ์ ์ธ ํ์ ๋ฐฉ๋ฒ์ธ ์ด์ง ํ์์ ๋ํด ์์๋ด ์๋ค.
์ด์ง ํ์์ ํ์์ ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ขํ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ํ์ ๋ฐฉ๋ฒ์ ๋๋ค. ๋จ, ๋ฆฌ์คํธ ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ๋ง ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์์ผ ๋๋ ์ฌ์ฉํ ์ ์์ง๋ง, ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ค๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค๋ ํน์ง์ด ์์ต๋๋ค.
์ด์ง ํ์์ ๋ฐ์ผ๋ก ์ชผ๊ฐ๋ฉฐ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์์์ , ๋์ , ์ค๊ฐ์ ์ด๋ ๊ฒ ์์น๋ฅผ ๋ํ๋ด๋ ๋ณ์ 3๊ฐ๋ฅผ ์ฌ์ฉํด์ ํ์์ ์งํํฉ๋๋ค. ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ์ ์ค๊ฐ์ ์์น์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๊ตํด์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๋๊ฐ๋ ๊ฒ์ด ์ด์ง ํ์์ ๊ณผ์ ์ ๋๋ค.
์ด์ง ํ์ ๊ทธ๋ฆผ์ผ๋ก ์ดํดํ๊ธฐ
์ด์ง ํ์์ ๊ทธ๋ฆผ์ผ๋ก ์ฝ๊ฒ ์ดํดํด๋ด ์๋ค. ์ด๋ฏธ ์ ๋ ฌ๋ 10๊ฐ์ ๋ฐ์ดํฐ ์ค ๊ฐ์ด 4์ธ ์์๋ฅผ ์ฐพ๋ ์์๋ก ์ดํด๋ณผ๊ฒ์!
์์์ , ๋์ , ์ค๊ฐ์ ์ ์ ํ๋ ๊ฒ์ผ๋ก ํ์์ ์์ํฉ๋๋ค.
์์์ ์ 0, ๋์ ์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ธ 9๋ก ์ ํ๊ณ , ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค๊ฐ Int ํ์ ์ด๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ ์ 4.5์์ ์์์ ์ ๋ฒ๋ ค์ 4๋ก ์ ํฉ๋๋ค. ๋ค์์ผ๋ก, ์ค๊ฐ์ ์ ๊ฐ๊ณผ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ๋น๊ตํฉ๋๋ค. ํ์ฌ, ์์ ๊ทธ๋ฆผ์์ ํ์ธํ ์ ์๋ฏ์ด ์ค๊ฐ์ ์ ๊ฐ์ธ 8๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ธ 4๊ฐ ๋ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ ์ค๊ฐ์ ์ดํ์ ๊ฐ๋ค์ ํ์ธํ์ง ์์๋ ๋๋ ๊ฐ๋ค์ด ๋๊ฒ ์ฃ ? (์ ๋ ฌ๋ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ํฐ ๊ฐ๋ค์์ด ๋ณด์ฅ๋์ด์์) ์ด๋ฅผ ์ด์ฉํด์ ๋ค์ ํ์์ ์งํํ๊ธฐ ์ํด ๋ค์ ์์์ , ๋์ , ์ค๊ฐ์ ์ ์ธํ ํฉ๋๋ค.
์ด์ ์๋ก์ด ๋์ ์ ์ด์ ํ์์์ ํ์ธํ ๊ฐ์ธ 8 ๋ฐ๋ก ์ด์ ์ ๊ฐ์ด ๋ฉ๋๋ค. ์์์ ์ ๊ทธ๋๋ก 0์ด ๋๊ณ , ์ค๊ฐ์ ์ ์์์ ๊ณผ ๋์ ์ ์ค์๊ฐ์ธ 1(1.5์์ ์์์ ์ ๋ฒ๋ฆฐ ๊ฐ)์ด ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์, ์ค๊ฐ์ ์ ๊ฐ๊ณผ ์ฐพ์์ผ ํ๋ ๊ฐ์ ๋น๊ตํด๋ณด๋ฉด ์ด๋ฒ์๋ ์ค๊ฐ์ ์ ๊ฐ์ธ 2๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ธ 4๊ฐ ๋ ํฐ ๊ฐ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ ์ค๊ฐ์ ์ด์ ์ ๊ฐ๋ค์ ์ ์ธํด๋ ๋๋ ๊ฐ๋ค์ด ๋ฉ๋๋ค!
์ด์ ํ์์์ ์ค๊ฐ์ ์ด์๋ ์ธ๋ฑ์ค ๋ฐ๋ก ๋ค์ธ 2๋ฅผ ์์์ ์ผ๋ก ์๋ก ์ธํ ํ๊ณ ๋์ ์ 3 ๊ทธ๋๋ก ๋๊ฒ ๋๋ฉด ์ค๊ฐ์ ์ ์์์ ๊ณผ ๊ฐ์ 2(2.5์์ ์์์ ์ ๋ฒ๋ฆฐ ๊ฐ)๊ฐ ๋ฉ๋๋ค. ์ค๊ฐ์ ์ ๊ฐ๊ณผ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ๋น๊ตํ๋ฉด ์ด๋ฒ์๋ ์ผ์นํ๋ฏ๋ก ์ฌ๊ธฐ์ ํ์์ด ์ข ๋ฃ๋ฉ๋๋ค!
์ ์ฒด ๋ฐ์ดํฐ์ ๊ฐ์๋ 10๊ฐ์ง๋ง, ์ด์ง ํ์์ ์ด์ฉํด ์ด 3๋ฒ์ ํ์์ผ๋ก ์์๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค. ์์ ์์์ ๊ฒฝ์ฐ ์์ฐจ ํ์์ ์ด์ฉํด๋ 3๋ฒ์ ํ์์ผ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๊ฒ ์ง๋ง, ํจ์ฌ ๋์ ๋ฒ์์์ ํ์์ ํ๊ฒ ๋ ๊ฒฝ์ฐ ์์ฐจ ํ์๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ผ๋ก ํ์ํ ์ ์์ ๊ฒ์ ๋๋ค. ์ด์ง ํ์์ ํ ๋ฒ ํ์ธํ ๋๋ง๋ค ํ์ธํ๋ ์์์ ๊ฐ์๊ฐ ์ ๋ฐ์ฉ ์ค์ด๋ ๋ค๋ ์ ์์ ์๊ฐ ๋ณต์ก๋๊ฐ O(logN)์ ๋๋ค.
Swift ์ฝ๋๋ก ๊ตฌํํ๊ธฐ
์์ ์์์์ ์ ์ ์๋ฏ์ด ์ด์ง ํ์์ ์์น๋ฅผ ๋ํ๋ด๋ ๋ณ์ ์ธํ , ์ค๊ฐ๊ฐ๊ณผ ๋น๊ต ๋ผ๋ ๊ณผ์ ์ด ๊ณ์ ๋ฐ๋ณต๋๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ทํจ์, ๋ฐ๋ณต๋ฌธ ์ด๋ ๊ฒ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ํ๋์ฉ ์ดํด๋ด ์๋ค!
// ์ฌ๊ท ํจ์๋ก ๊ตฌํํ๊ธฐ
func binarySearch(_ array: [Int], num: Int) -> Int {
if array.count == 1 { // ๋ฐฐ์ด ํฌ๊ธฐ 1์ธ ๊ฒฝ์ฐ
return array[0] == num ? 0 : -1
}
// ๋ฐฐ์ด ํฌ๊ธฐ 1์ด์์ด๋ผ๋ฉด
let mid = array.count / 2 // ์ค๊ฐ์
if array[mid] == num { return mid } // ์ฐพ์ผ๋ ค๋ ๊ฐ ์ฐพ์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ธ๋ฑ์ค ๋ฆฌํด
// ์ค๊ฐ์ ๊ฐ์ด ์ฐพ์ผ๋ ค๋ ๊ฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ -> ํ์ ๋ฒ์๋ฅผ 0~์ค๊ฐ์ -1๊น์ง
// ์ค๊ฐ์ ๊ฐ์ด ์ฐพ์ผ๋ ค๋ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ -> ํ์ ๋ฒ์๋ฅผ ์ค๊ฐ์ +1~๋๊น์ง๋ก ๋ค์ ์ค์
let range = array[mid] > num ? (0..<mid) : ((mid + 1)..<array.count)
return binarySearch(Array(array[range]), num: num)
}
// ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ๊ธฐ
func binarySearch(_ array: [Int], num: Int) -> Int {
var start = 0 // ์์์
var end = (array.count - 1) // ๋์
while start <= end {
let mid = (start + end) / 2 // ์ค๊ฐ์
if array[mid] == num { return mid } // ์ฐพ์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ธ๋ฑ์ค ๋ฐํ
if array[mid] > num { // ์ฐพ์ผ๋ ค๋ ๊ฐ๋ณด๋ค ์ค๊ฐ์ ์ด ๋ ํฐ ๊ฒฝ์ฐ -> ์ค๊ฐ์ ์ดํ ๋ฐ์ดํฐ ํ์ธ ํ์ x
end = mid - 1 // ๋์ ์ ์ค๊ฐ์ -1๋ก ์ฎ๊ธด๋ค
} else { // ์ฐพ์ผ๋ ค๋ ๊ฐ๋ณด๋ค ์ค๊ฐ์ ์ด ๋ ์์ ๊ฒฝ์ฐ -> ์ค๊ฐ์ ์ด์ ๋ฐ์ดํฐ ํ์ธ ํ์ x
start = mid + 1 // ์์์ ์ ์ค๊ฐ์ +1๋ก ์ฎ๊ธด๋ค
}
}
return -1
}
binarySearch()๋ ํ๋ผ๋ฏธํฐ๋ก ํ์ํด์ผ ํ ๋ฐฐ์ด๊ณผ ์ฐพ๊ณ ์ํ๋ ๊ฐ์ ๋๊ฒจ ๋ฐ๋ ํจ์์ด๊ณ , ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ๋ฐฐ์ด ์์ ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์์ ๋ฆฌํดํ๊ณ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ก ๋์ฌ ์ ์๋ ๊ฐ์ธ -1์ ๋ฆฌํดํ๊ฒ ๋ฉ๋๋ค.
์์์ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณธ ๊ณผ์ ์ ๋ค์ ๋ ์ฌ๋ ค๋ณด๋ฉฐ ์ฃผ์๊ณผ ํจ๊ป ์ฝ๋๋ฅผ ์ฝ์ด๋ณด๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๋์ค ๊ฒ ๊ฐ์ต๋๋ค!
[์ฐธ๊ณ ์๋ฃ]
<์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ>
'๐ฅ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ์ง๊ฒ๋ค๋ฆฌ ๊ฑด๋๊ธฐ (2) | 2023.03.31 |
---|---|
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ๊ธฐ์ง๊ตญ ์ค์น (2) | 2023.03.30 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.2) - ๋ฌด์ธ๋ ์ฌํ (1) | 2023.01.29 |
[Algorithm/Swift] ๋์ ๊ณํ๋ฒ(Dynamic Programming) (2) | 2023.01.11 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.1) - [1์ฐจ] ๋คํธ๊ฒ์ (0) | 2022.12.17 |