โถ ์ ํ
- ์ด์งํ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ผ๋ก ๊ณ์ ๋ฒ์๋ฅผ ์ชผ๊ฐ๊ฐ๋ฉฐ ํ๊ฒ ๊ฐ์ ์ฐพ๋ ๊ธฐ๋ฒ์ด๋ค. ๊ทธ๋์ ์์ฐจํ์์ด `O(n)` ๊ฑธ๋ฆด ๋ ์ด์งํ์์ `O(logN)`์ด ๋๋ค.
- ๊ทผ๋ฐ ์ ๋ ฌ๋ ์ํ๋ฅผ ์ ์ ๋ก ๋๋ค. ๋ฐ๋ผ์ ์ด ์๊ฐ ๋ณต์ก๋๋ `O(NlogN)`์ด๋ค.
- ์ ๋์ L, R๋ก ๋๊ณ , L๊ณผ R์ ์์๊ฐ ์ญ์ ๋๋ ์๊ฐ์ด ์ข ๋ฃ ์กฐ๊ฑด์ด๋ค.
- ๊ฒฐ์ ์กฐ๊ฑด์ ๊ฐ์ง๋ ์ต์ ํ ๋ฌธ์ ์ธ ํ๋ผ๋ฉํธ๋ฆญ ์์น์ ๊ฒฝ์ฐ์๋, L์ ์ ๋ต์ด ์๋ผ์ ๊ณ์ ์ฌ๋ผ๊ฐ๊ณ , R์ ์ ๋ต์ด ๋์(์ ๋ต์ด ์๋ ์ ๋ ์์)์๋ ๋ ์ต์ ์ธ ๋ต์ด ์์ ๊ฐ๋ฅ์ฑ์ ๋๊ณ ๋ด๋ ค๊ฐ๋ค.
๊ธฐ๋ณธ์ ์ธ ํํ๋ ์๋์ ๊ฐ๋ค.
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid; // ์ฐพ์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ๋ฐํ
}
if (arr[mid] < target) {
left = mid + 1; // ์ค๊ฐ๊ฐ๋ณด๋ค ํฌ๋ฉด ์ค๋ฅธ์ชฝ ์ ๋ฐ ํ์
} else {
right = mid - 1; // ์ค๊ฐ๊ฐ๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ ์ ๋ฐ ํ์
}
}
return -1; // ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ
}
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ๋ค๊ฐ ์ฐ๋ฉด `Arrays.binarySearch()`๋ก ์ฌ์ฉํ ์ ์๋ค. ๋จ์ํ ์ด์งํ์์ ์ด๋ ต์ง ์๋ค. ๋ด๊ฐ ์ฒ์ ์ด์งํ์์์ ์ด๋ ค์์ ๋๊ผ๋ ๊ฑด lower bound, upper bound์๋ค.
#Lower Bound, Upper Bound
์๋ ๋ณดํต ์ธ์ ์ฐ๋ ํ๋ฉด, ์ค๋ณต๋ ๊ฐ์ด ๋ฐฐ์ด์ ์กด์ฌํ๊ณ , ์ด๋ค ์์น์์ ์ฐพ๊ฒ ๋ ์ง ๋ชจ๋ฅด๋ ์ํฉ์ ์ฌ์ฉํ๋ค. lower bound๋ ํ๊ฒ ๊ฐ ์ด์์ ๊ฐ์ด ์ต์ด๋ก ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๊ณ , upper bound๋ ๊ทธ ๋ฐ๋๋ค.
์ฆ lower bound๋ ํ๊ฒ ๊ฐ๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฐ ์์ ์ค ๊ฐ์ฅ ์์น๊ฐ์ด ์์ ๊ฐ์ ์ฐพ๋ ๊ฒฝ์ฐ๋ค.
public static int lowerBound(List<Integer> arr, int target) {
int left = 0;
int right = arr.size() - 1;
int idx = arr.size(); // ์ต์์์น์ด๋ฏ๋ก, ๋ต์ด ๋ ์ ์๋ ๊ฐ๋ณด๋ค ๋ ํฐ ๊ฐ์ผ๋ก ์ค์ (min max ๊ฐ๋
)
while (left <= right) {
int mid = (left + right) / 2;
if (arr.get(mid) >= target) { // ๋ง์ฝ์ ์ ํํ ์์๊ฐ target๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฌ๋ค๋ฉด
right = mid - 1; // ์ผ์ชฝ์ target์ด ๋ ์์ ์ ์์ผ๋ right ๊ฐฑ์
idx = Math.min(idx, mid); // ์ต์ ์์น๊ฐ(lower bound) ๊ณ์ ๊ฐฑ์
} else {
left = mid + 1; // ํ๊ฒ๋ณด๋ค ์์ผ๋ฉด left ๊ฐฑ์
}
}
return idx;
}
upper bound๋ ๊ทธ ๋ฐ๋์ธ ์ด๊ณผ๊ฐ ๋๋ ์๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋๋ฐ, `arr.get(mid) > target`์ผ๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ ์๊ฐํด๋ณด๋ฉด lower bound ์ upper bound์ idx ์ฐจ์ด ๊ฐ์ ๊ทธ ํ๊ฒ ๊ฐ์ ๊ฐ์๊ฐ ๋๋ค. ๋ฐ๋ผ์ ์ฐจ์ด๊ฐ 0์ด๋ผ๋ฉด ํด๋น ๊ฐ์ด ๋ฐฐ์ด์ ์๋ค๋ ๊ฑธ ์์ฐ์ค๋ฝ๊ฒ ์ ์ ์๋ค.
# ํ๋ผ๋ฉํธ๋ฆญ ์์น
๊ฒฐ์ ๋ฌธ์ ๋ผ๋ ๊ฑธ ๊ฐ๊ณ , ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต์/์ต๋๊ฐ์ ๊ตฌํ๋ ๋๊ตฌ๋ค.
https://www.acmicpc.net/problem/2805
๋ฐฑ์ค ๋๋ฌด์๋ฅด๊ธฐ ๋ฌธ์ ๋ฅผ ์์๋ก ๋ค์ด๋ณด๊ฒ ๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋, 2๊ฐ์ง๋ก ๋ถ๋ถ์ ๋๋ ์ ์์ ํ๋ค.
// ํน์ ๋์ด๋ก ๋๋ฌด๋ค์ ์๋์ ๋ ์ป์ ์ ์๋ ์ด ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๋ ํจ์
private static long namuCalculateCutLength(int height) {
long sum = 0;
for (int tree : trees) { // trees๋ ๋ฐฐ์ด
if (tree > height) {
sum += tree - height;
}
}
return sum;
}
๋๋ฌด๋ฅผ ๊ณ์ ์๋ฅด๋ฉด์ ํฉ์ ๊ตฌํ๊ณ ์ด์งํ์์ ์กฐ๊ฑด์ผ๋ก ํ์ฉํ๋ฉด ๋๋ค.
public static int namuCut() {
int l = 0;
int r = len; // ๊ฐ์ฅ ๋์ ๋๋ฌด์ ๋์ด
while (l <= r) {
int mid = (l + r) / 2;
if (namuCalculateCutLength(mid) >= m) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return end;
}
์ด ๋ฌธ์ ๋ ๊ฒฐ์ ์กฐ๊ฑด์ L์ ๋ค๋ฃฌ๋ค. ๊ทธ ์ด์ ๋ ๊ฒฐ๊ตญ ์ต๋๊ฐ์ ๊ตฌํด์ผ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ต์๊ฐ์ ๊ตฌํ ๋๋ R์ ๋ค๋ฃจ๊ณ , ์ด๋ฒ ๋ฌธ์ ์ฒ๋ผ ์ต๋๊ฐ์ ๋ค๋ฃฐ ๋๋ L์ ๊ฒฐ์ ์กฐ๊ฑด์ ์๋ต์ผ๋ก ์ฌ์ฉํด์ผ๋๋ค.
โถ ์ ๋ต
์ด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ฉด์ ์ต์ํด์ ธ๋ณด์.
https://www.acmicpc.net/problem/10815
์ด์ง ํ์ ๊ทธ ์์ฒด์ธ ๋ฌธ์ ๋ค.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int n, m;
static int sanggun[];
static int find[];
static StringBuilder sb;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
sanggun = new int[n];
for (int i = 0; i < n; i++) {
sanggun[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine(), " ");
m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
find = new int[m];
for (int i = 0; i < m; i++) {
find[i] = Integer.parseInt(st.nextToken());
}
// ํ์์ ์ํ ์ ๋ ฌ
Arrays.sort(sanggun);
sb = new StringBuilder();
for (int i = 0; i < m; i++) {
sb.append(isExist(find[i])).append(" ");
}
System.out.println(sb);
}
public static int isExist(int t) {
int l = 0;
int r = n - 1; // ์ ๋๊ฐ ์ธํ
while (l <= r) {
int m = (l + r) / 2;
if (sanggun[m] == t) {
return 1;
}
if (sanggun[m] > t) {
r = m - 1;
} else {
l = m + 1;
}
}
return 0;
}
}
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'OJ๐ผ > ์๊ณ ๋ฆฌ์ฆ ์ ํ ์ ๋ฆฌ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋งจํดํผ ๊ฑฐ๋ฆฌ๊ฐ ์ต์๊ฐ ๋๋ ์ง์ ์ฐพ๊ธฐ (0) | 2025.01.08 |
---|---|
๋ชจ๋ ธํค์คํ(๋จ์กฐ์คํ)โฐ (0) | 2025.01.07 |
์ ๋ ฌ - Comparable<T> ~ compareTo(T o1) (0) | 2024.05.29 |
Dynamic Programming์ด ์์ธ DFSโ๏ธ - ๋ด๋ฆฌ๋ง๊ธธ, ์์ฌ์์ด ํ๋ค๐ผ (0) | 2024.04.07 |
์ ๋ ฌโ๏ธ- ์์์ ๋ ฌ (0) | 2024.04.04 |