๐ Problem Solving/๐ฅ Algorithm
upper bound, lower bound : ์ด๋ถํ์
snowball๐ฐ
2023. 4. 3. 12:09
๐ Lower Bound(์๊ณ)
์ ๋ ฌ๋์ด ์๋ ๋ฐ์ดํฐ set์์ K๊ฐ ์ด์์ด ์ฒ์ ๋ฐ๊ฒฌ๋๋ ์์น๋ฅผ ์๋ฏธํ๋ค.
๐ Upper Bound(ํ๊ณ)
์ ๋ ฌ๋์ด ์๋ ๋ฐ์ดํฐ set์์ K๊ฐ๋ณด๋ค ํฐ ๊ฐ์ด ์ฒ์ ๋ฐ๊ฒฌ๋๋ ์์น๋ฅผ ์๋ฏธํ๋ค.
๐ก ์๋ฅผ ๋ค์ด
1 2 2 3 3 3 4 5 ์ ๋ฐ์ดํฐ set์์
lower bound(3) = 3, upper bound(3) = 6
@ ๋ฐ์ดํฐ set์ index๋ 0์์๋ถํฐ, lower bound(์ฐพ๊ณ ์ ํ๋ ์ซ์ = K)
โ ์ด๋ถ ํ์์ ์ด์ฉํ์ฌ upper bound, lower bound๋ฅผ ๊ตฌํด ๋ณด์!
## lower bound
int start = 0; int end = N-1;
while(start <= end) {
int mid = (start + end) / 2;
if(set[mid] < K) start = mid + 1;
else end = mid - 1;
}
System.out.println(start);
์ด๋, start๋ K๊ฐ์ด ๊ฐ์ฅ ์ฒ์์ผ๋ก ๋์ค๋ ๊ณณ! (index)
## upper bound
int start = 0; int end = N-1;
while(start <= end) {
int mid = (start + end) / 2;
if(set[mid] <= K) start = mid + 1;
else end = mid - 1;
}
System.out.println(end);
์ด๋, end๊ฐ K๊ฐ์ด ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ๋์ค๋ ๊ณณ!
๐ก ์ด๋ถํ์์ ๋ ๊ทธ๋ฃน์ ์ด๋ป๊ฒ ๋๋๋๋๊ฐ ๊ฐ์ฅ ์ค์ํ๋ค.
lower bound๋ (์์) (ํฌ๊ฑฐ๋ ๊ฐ์)์ผ๋ก ๋๋์๊ณ upper bound๋ (์๊ฑฐ๋ ๊ฐ์) (ํฐ) ์ผ๋ก ๋๋์๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ ‘๊ฐ์’์ ํฌํจ๋์ด ์๋ค!
lower bound๋ ๊ฒฐ๊ตญ ๋ ๊ทธ๋ฃน์ ๋๋๋ ๊ฐ์์ ์ข ๋ฃํ๊ฒ ๋๋๋ฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ ํฌ๊ฑฐ๋ ๊ฐ์ ์ชฝ(end)์ ํฌํจ๋์ด ์๋ค. start = end + 1์์ ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ start์ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ด ๋๋ค.
upper bound๋ start์ ๊ฐ์ด ๋๋ค. ๊ทธ๋ฌ๋ start๋ ๋ง์ง๋ง์ +1์ด ๋์ด ๋์ค๊ธฐ ๋๋ฌธ์ end์ ๊ฐ์ด ์ ๋ต์ด ๋๋ค.
## ๋ฌธ์ ์ถ์ฒ
https://www.acmicpc.net/problem/2143
2143๋ฒ: ๋ ๋ฐฐ์ด์ ํฉ
์ฒซ์งธ ์ค์ T(-1,000,000,000 ≤ T ≤ 1,000,000,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ n(1 ≤ n ≤ 1,000)์ด ์ฃผ์ด์ง๊ณ , ๊ทธ ๋ค์ ์ค์ n๊ฐ์ ์ ์๋ก A[1], …, A[n]์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ m(1 ≤ m ≤ 1,000)์ด ์ฃผ์ด์ง๊ณ , ๊ทธ
www.acmicpc.net