์์ฐจ ํ์ / ์ด์ง ํ์
์์ฐจ ํ์
- ๋ฐฐ์ด ์์ ์๋ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ฐจ๋ก๋๋ก ํ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ ๋ ฌ๋์ง ์์ ๋ฐฐ์ด์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
- ๋ฐ์ดํฐ๊ฐ ์๋ฌด๋ฆฌ ๋ง์๋ ์๊ฐ์ด ์ถฉ๋ถํ๋ค๋ฉด ํญ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
- ์ ์ผ ์ฒ์ ์ธ๋ฑ์ค๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋
**O(N)**
์ด๋ค. (N = ๋ฐฐ์ด์ ๊ธธ์ด) (๋ญ๊ฐ ๋ฒ๋ธ ์ ๋ ฌ๊ณผ ๋น์ทํ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ค.)
์ด์ง ํ์
- ๋ฐฐ์ด์ด ์ ๋ ฌ๋์ด ์๋ค๋ ์ ์ ํ์ ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์์์ ๊ณผ ๋์ ์ ์ด์ฉํด ์ค๊ฐ์ ์ ์ฐพ๊ณ , ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ์ค๊ฐ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๋ ๊น์ง ๋ฐ๋ณตํ๋ค.
- ์ฆ, ์ฌ๊ท ํจ์ ๋๋ ๋ฐ๋ณต๋ฌธ์ ํตํด ๊ตฌํํ ์ ์๋ค.
- ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ค์ฌ ๋๊ฐ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ์๊ฐ ๋ด์ ํ์์ ๋ง๋ฌด๋ฆฌ ํ ์ ์๋ค.
- ๋จ, ๋ฐฐ์ด ๋ด ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ ์ต์ ์ ์๊ณ ๋ฆฌ์ฆ์ ์๋๋ค.
Lower / Upper Bound
- ์ด์ง ํ์์ ๊ฒฝ์ฐ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ต์ ์ด์ง๋ง, ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ต์ ์ด ๋ ์ ์๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋์จ ์๊ณ ๋ฆฌ์ฆ์ด Lower / Upper Bound ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
Lower Bound
- ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๊ฐ๊ฑฐ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ํฌ๊ธฐ์ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.
- ์ฆ, Lower Bound๋ฅผ ํตํด ๋ฐํ๋ ์ธ๋ฑ์ค ๋ฒํธ ์ดํ์ ๋ฐ์ดํฐ๋ ๋ช ๊ฐ์ธ์ง๋ ๋ชจ๋ฅด์ง๋ง ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ์ด๋ค. (์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด์ Upper Bound ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ๋ค.)
- ๊ทธ๋ฌํ ์ด์ ๋ก ๋ฐํ๋ ์ธ๋ฑ์ค ๋ฒํธ ์ด์ ์ ์ธ๋ฑ์ค์๋ ์ ๋ ํด๋น ๋ฐ์ดํฐ๋ ๋ฐฐ์ด ๋ด์์ ์กด์ฌํ์ง ์๋๋ค.
- ๋ง์ฝ ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ฐฐ์ด ๋ด์ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ๊ทผ์ ํ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๋ฐํํ๋ค.
Upper Bound
- ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ฐฐ์ด ๋ด์์ ๋ช ๊ฐ๊ฐ ์กด์ฌํ๋์ง ๋ชจ๋ฅด๋ Lower Bound ์๊ณ ๋ฆฌ์ฆ์ ๋ณด์ํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- Upper Bound ์๊ณ ๋ฆฌ์ฆ์ ์ฐพ๊ณ ์ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด๊ณผ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๋ฐํํ๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ
์ด์ง ํ์์ ์์ฉํด์ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
๋ถํ ์ฐพ๊ธฐ - ์ด์ฝํ
package ์ฌ์ฑํ.์๊ณ ๋ฆฌ์ฆ_5์ฃผ์ฐจ.์ด์ฝํ
;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class ๋ถํ์ฐพ๊ธฐ_์ด์ฝํ
{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int n, m;
static int[] arr1, arr2;
public static void main(String[] args) throws Exception {
// N = ๋ฌผ๊ฑด์ ๊ฐ์ / M = ๋ด๊ฐ ์ฐพ๋ ๋ฌผ๊ฑด์ ๊ฐ์
// N ์
๋ ฅ
n = Integer.parseInt(br.readLine());
arr1 = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
int idx = 0;
while (st.hasMoreTokens()) {
arr1[idx] = Integer.parseInt(st.nextToken());
idx++;
}
// M ์
๋ ฅ
m = Integer.parseInt(br.readLine());
arr2 = new int[m];
st = new StringTokenizer(br.readLine());
idx = 0;
while (st.hasMoreTokens()) {
arr2[idx] = Integer.parseInt(st.nextToken());
System.out.print(find(arr1, 0, n - 1, arr2[idx]) + " ");
idx++;
}
}
public static String find(int[] arr, int start, int end, int target) {
if (start > end) return "No";
int mid = (start + end) / 2;
if (arr[mid] == target) return "Yes";
else if (arr[mid] > target) return find(arr, start, mid - 1, target);
else return find(arr, mid + 1, end, target);
}
}
์ด๋ฒ ๋ฌธ์ ๋ ๋น๊ต์ ์ฝ๊ฒ(?) ํ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
๋ค๋ง ์ฃผ์ด์ง ํ
์คํธ ์ผ์ด์ค์์ ๋ง์ง๋ง ์ถ๋ ฅ๊ฐ์ด Yes
๋ก ์ถ๋ ฅ๋์ด์ผ ํ๋๋ฐ ์๊พธ No
๋ก ์ถ๋ ฅ๋์ด์ ์ ์ด๋ฐ์ง ์ด์ ๋ฅผ ์ฐพ๋๋ฐ ์๊ฐ์ด ๊ฝค๋ ์์๋๋ค.
find
๋ฉ์๋๋ String ์๋ฃํ์ ๋ฐํํ๋๋ฐ, else if
๊ตฌ๋ฌธ์์ ์ฌ๊ท๋ก find
๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ํด๋๊ณ ์๋ ์ด๊ฑธ return
ํด์ฃผ์ง ์๋ ์ ๋ง ์ฌ์ํ ๋ฌธ์ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ์์๋๋ค. ๋ง๋ค. ๋ ๋ฐ๋ณด๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1158 | Queue, ์์ธํธ์ค ๋ฌธ์ (0) | 2020.11.25 |
---|---|
๋ฐฑ์ค 10816 | ์ซ์ ์นด๋ 2 (0) | 2020.11.07 |
๋ฐฑ์ค 2667 | DFS, ๋จ์ง ๋ฒํธ ๋ถ์ด๊ธฐ (0) | 2020.11.02 |
๋ฐฑ์ค 2138 | ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ์ ๊ตฌ์ ์ค์์น (0) | 2020.11.01 |
Graph | DFS(๊น์ด ์ฐ์ ํ์), BFS(๋๋น ์ฐ์ ํ์) (0) | 2020.10.31 |