멋있는 JavaScript
[JS] 백준 수 찾기 -시간 초과, 이진 탐색
강하다이녀석
2024. 2. 7. 19:23
문제
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.
시도 1. 이중 포문 안되겠지만 해봄
-> 안됨
//const input = require('fs').readFileSync("./input.txt").toString().trim().split('\n');
let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const N = Number(input[0])
const targetNum = input[1].split(" ").map(Number);
const M = Number(input[2])
const numLst = input[3].split(" ").map(Number);
for (let num of numLst){
let flag = 0
for (let target of targetNum){
if (num === target){
flag = 1;
break
}
}
console.log(flag)
}
안될 것 같았다! 그럼 이진 탐색으로 해야지
쉬운 문제라고 해서 집중 안하고 풀었다가
1. start, end, mid 초기화 이상한 곳에 해줘서
2. 타겟 리스트 반대로 적용해서 틀리고 난리남.
하여튼 제정신 차리고 이진탐색으로 풀었는데 시간 초과
// const input = require('fs').readFileSync("./input.txt").toString().trim().split('\n');
let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const N = Number(input[0])
const targetNum = input[1].split(" ").map(Number);
const M = Number(input[2])
const numLst = input[3].split(" ").map(Number);
targetNum.sort((a,b)=> a- b)
for (let num of numLst){
let anwser = 0;
let start = 0;
let end = N-1;
while (start <= end){
let mid = Math.floor((start + end)/2)
if(targetNum[mid] > num){
end = mid-1;
}else if (targetNum[mid] < num){
start = mid+1;
}else{
anwser = 1;
break;
}
}
console.log(anwser);
}
왜 이진탐색도 안되지?
->
node.js에서 console.log() 함수가 생각보다 시간을 많이 잡아먹는다고 한다!
// const input = require('fs').readFileSync("./input.txt").toString().trim().split('\n');
let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
const N = Number(input[0])
const targetNum = input[1].split(" ").map(Number);
const M = Number(input[2])
const numLst = input[3].split(" ").map(Number);
targetNum.sort((a,b)=> a- b)
let answer = '';
for (let num of numLst){
flag = false;
let start = 0;
let end = N-1;
while (start <= end){
let mid = Math.floor((start + end)/2)
if(targetNum[mid] > num){
end = mid-1;
}else if (targetNum[mid] < num){
start = mid+1;
}else{
answer += '1\n';
flag = true;
break;
}
}
if(!flag){
answer += '0\n'
}
}
console.log(answer)
그냥 한번만 로그 찍도록 변경