#1 ์๊ณ ๋ฆฌ์ฆ
#1-1
์ด์ง ํ์ (Binary search)
#1 ์๊ณ ๋ฆฌ์ฆ ์ด๋ ๊ฒ ํด์ x์ ์ธ๋ฑ์ค i๋ฅผ ์ฐพ์ผ๋ฉด ์ข๊ฒ ์ง๋ง, ์ด x๊ฐ ๋ฐฐ์ด values ์ด๋์๋ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์ ๊ฒ์ด๋ค. ์ด ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊น? ์ ์ค ๋ค์ด ๊ฒ์์ ์ฐ๋ฆฌ๋๋ผ์์ ์์ฃผ
kenel.tistory.com
ํด๋น ๊ธ์์ ์ด์ด์ง๋ค.
#1-2
#1-3
์ค๋ณต๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ์ด์ง ํ์์์ min < max๊ฐ ๋๋ ์์ ์ด while์ ํ์ถ ์์ ์ด์๋ค. ๋ฐ๋ฉด, ์ค๋ณต๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ์ด์ง ํ์์์ min = max๊ฐ ๋๋ ์์ ์ด while์ ํ์ถ ์์ ์ด๋ค. min = max๋ ๊ฒ์ ๋ฒ์๊ฐ i์ ์ต๋๋ก ์ ๊ทผ ์ฆ, ์์ ๊ฐ์ ๊ฐ์ด ๋์๋ค๋ ์๋ฏธ๋ค.
#1-4
binarySearch() ๋๋น binarySearchFirstIndex() ๋๋ binarySearchLastIndex()์์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋นจ๊ฐ๊ฒ ๊ฐ์กฐ ํ์ํ๋ค. ํ์ง๋ง, ๋ฉ๋์ด ๋์ง ์๋ ๋ถ๋ถ์ด ๋ณด์ธ๋ค. ๋ฐ๋ก binarySearchLastIndex()์์ mid = (min + max) / 2์ ๊ทธ์น์ง ์๊ณ ์ถ๊ฐ๋ก 1์ ๋ํ ๋ถ๋ถ์ด๋ค. ๊ฒ๋ค๊ฐ binarySearchFirstIndex()๋ mid๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ด binarySearch()์ ๋๊ฐ์๋ฐ binarySearchLastIndex() ํผ์๋ง ๋ค๋ฅธ ๊ฒ์ ๋๋์ฑ ์์ํ๋ค.
#1-5
binarySearchLastIndex()์ mid์ ์ถ๊ฐ๋ก 1์ ๋ํ์ง ์์๋ค๋ฉด ๋ฐ์ํ๋ ์ํฉ์ด๋ค. min๊ณผ max๊ฐ ์์ํ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ด binarySearchLastIndex()์ return์ ๋ฌดํํ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค. ์ด ์ํฉ์ intํ๋ผ๋ฆฌ์ / ์ฐ์ฐ์ ํน์ง์์ ๊ธฐ์ธํ๋ค.
#1-6
#1-7
์๊ณ ๋ฆฌ์ฆ์ ์ด๋ ๊ฒ ๊ฐ์ํ ํ ์๋ ์๋ค.โจwhile๋ฌธ์ด ์งํ๋จ์ ๋ฐ๋ผ, binarySearchFirstIndex()์ max ๋๋ binarySearchLastIndex()์ min์ด ๊ฐ๊ฐ ifirst์ ilast์ ๊ฐ์์ง ๋๊น์ง ์ ๊ทผํ๋ ๊ฒฝํฅ์ฑ์ด ๊ฐ์ํ ์ ๊ณผ ๋์ผํ๊ฒ ์ ์ง๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ(๊ณ์ฐ ์๋ ฅ)์ ๋ฏธ์ธ๋จผ์ง๋งํผ์ด๋ผ๋ ๋จ์ด์ง ๊ฒ์ด๋ค.
#2 ์ฝ๋
#2-1 ์๋ฐ
public static int binarySearchFirstIndex(int[] values, int x) {
int min = 0;
int max = values.length - 1;
while (min < max) {
int mid = (min + max) / 2;
// up
if (values[mid] < x) {
min = mid + 1;
// equal
} else if (values[mid] == x) {
max = mid;
// down
} else { // values[mid] > x
max = mid - 1;
}
}
if(values[min] == x) {
return min;
} else {
return -1;
}
}
public static int binarySearchLastIndex(int[] values, int x) {
int min = 0;
int max = values.length - 1;
while (min < max) {
int mid = (min + max) / 2;
// up
if (values[mid] < x) {
min = mid + 1;
// equal
} else if (values[mid] == x) {
min = mid;
// down
} else { // values[mid] > x
max = mid - 1;
}
}
if(values[max] == x) {
return max;
} else {
return -1;
}
}
#2-2 ์ฝํ๋ฆฐ
fun binarySearchFirstIndex(values : Array<Int>, x : Int) : Int {
var min = 0
var max = values.size - 1
while(min < max) {
val mid = (min + max) / 2
// up
if(values[mid] < x) {
min = mid + 1
// equal
} else if(values[mid] == x) {
max = mid
// down
} else { // values[mid] > x
max = mid - 1
}
}
if(values[min] == x) {
return min
} else {
return -1
}
}
fun binarySearchLastIndex(values : Array<Int>, x : Int) : Int {
var min = 0
var max = values.size - 1
while(min < max) {
val mid = (min + max) / 2 + 1
// up
if(values[mid] < x) {
min = mid + 1
// equal
} else if(values[mid] == x) {
min = mid
// down
} else { // values[mid] > x
max = mid - 1
}
}
if(values[max] == x) {
return max
} else {
return -1
}
}
#3 ์์ฝ
์ค๋ณต๋ ์์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ์ด์ง ํ์์, ๊ฐ์ ๊ฐ์ ๊ณต์ ํ๋ ์ธ๋ฑ์ค๋ค ์ค์์ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค ๋๋ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์ ์ง์ ์ผ๋ก ์ ๊ทผํ๋ค.
#4 ์ด ๊ฐ๋ ์ด ์ฌ์ฉ๋ ๊ธ
[๋ฐฑ์ค] 1654 (๋์ ์๋ฅด๊ธฐ)
#1 ์๊ณ ๋ฆฌ์ฆ #1-1 #1-2 ์ค๋ณต๋ ์์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ์ด์ง ํ์ (Binary Search) #1 ์๊ณ ๋ฆฌ์ฆ ์ด์ง ํ์ (Binary search) #1 ์๊ณ ๋ฆฌ์ฆ ์ด๋ ๊ฒ ํด์ x์ ์ธ๋ฑ์ค i๋ฅผ ์ฐพ์ผ๋ฉด ์ข๊ฒ ์ง๋ง, ์ด x๊ฐ ๋ฐฐ์ด values ์ด๋์๋
kenel.tistory.com
[๋ฐฑ์ค] 2805 (๋๋ฌด ์๋ฅด๊ธฐ)
#1 ๊ฐ์#1-1 ๋ฌธ์ ์ดํด'๋๋ฌด๋ฅผ ์๋ฅด๋ ๋์ด(cuttingHeight)'๊ฐ ๋ฌด์์ธ์ง๋ฅผ ๋ฌป๋ ๋ฌธ์ ๋ค. ๊ทธ๋ฆฌ๊ณ cuttingHeight์ ๋ฒ์๋ 0 ~ 1,000,000,000์ด๋ค. ๋ฐ๋ผ์, cuttingHeight๋ฅผ 1์ฉ ์ฆ๊ฐ์์ผ์ ์ผ์ผํ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์
kenel.tistory.com
'๊นจ์ ๊ฐ๋ ๐ > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ ฌ - ๋ณํฉ ์ ๋ ฌ (Merge Sort) (1) | 2023.11.14 |
---|---|
์ ๋ ฌ - ๋ฒ๋ธ ์ ๋ ฌ (Bubble Sort) (0) | 2023.11.13 |
์ด์ง ํ์ (Binary search) (0) | 2023.11.06 |
์ ๋ ฌ - ์ ํ ์ ๋ ฌ (Selection Sort) (0) | 2023.11.02 |
๋ฐฐ์ด์ ๊ธธ์ด(length)์ ์์์ ์๋ฒ(index) (0) | 2023.11.01 |