function search(st, en, target){
//시작과 끝이 만나면
if(st == en){
//~~
return
}
//가운데 값 구하고
const mid = Math.floor((st+en) / 2)
//목표값보다 작으면
if(nums[mid] < target){
//시작점을 이동
search(mid+1, en target)
} else { //목표값보다 작으면
//끝점을 이동
search(st, mid, target)
}
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.
조건 : N(1 ≤ N ≤ 100,000) = 1e5, M(1 ≤ M ≤ 100,000) = 1e5
ex)
input:
5
4 1 5 2 3
5
1 3 7 9 5
output:
1
1
0
0
1
처음 아이디어 및 시간복잡도
M개를 확인해야하는데, 연속하다는 특징 활용 가능(투포인터)? => 불가
정렬해서 이진탐색 가능?
시간복잡도
자료구조
//이진탐색
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on("line", function (line) {
input.push(line);
}).on("close", () => {
/*
1. 아이디어
- N개의 숫자를 정렬
- M개를 for 돌면서, 이진탐색
- 이진탐색 안에서 마지막에 데이터 찾으면, 1출력, 아니면 0출력
2. 시간복잡도
- N개의 입력값 정렬 = O(N*lgN)
- M개의 입력값 정렬 = O(M*lgN)
- O((N+M)lgN) > 가능
3. 자료구조
- N개의 숫자 = []
- M개의 숫자 = []
*/
const N = parseInt(input[0]);
const nums = input[1].split(" ").map(Number);
const M = parseInt(input[2]);
const target_list = input[3].split(" ").map(Number);
//정렬해주고
nums.sort((a, b) => a - b);
function search(st, en, target) {
if (st == en) {
if (nums[st] == target) {
console.log(1);
} else {
console.log(0);
}
return;
}
const mid = Math.floor((st + en) / 2);
if (nums[mid] < target) {
search(mid + 1, en, target);
} else {
search(st, mid, target);
}
}
for (const index in target_list) {
search(0, N - 1, target_list[index]);
}
});