알고리즘 문제 풀이/Javascript

javascript 백준 11663 선분 위의 점

맛대 2024. 3. 29. 09:50

https://www.acmicpc.net/problem/11663

로직

  • 이진탐색 활용

  • 현재 값이 배열에서 어느 위치(현재 값보다 작은 값이 몇개 있는지)를 확인

    • 이 떄 끝나는 점은 해당 값이 포함이 되야함 => 현재값+1의 값을 탐색
  • a부터 b까지의 선에 점이 몇개 있는지 탐색 가정

    • a보다 작은 값의 개수 확인 => A
    • b보다 작거나 같은 값의 개수 확인(b+1 확인) => B
    • b보다 작거나 같으면서 a보다는 큰 값의 수 = B-A
const fs = require('fs');
const URI = process.platform === 'linux'? 'dev/stdin':'./11663.txt';
const inputs = fs.readFileSync(URI).toString().trim().split('\n').map((x)=>x.split(' ').map(Number));

const biSearch = (nums,value)=>{
    let [s,e] = [0,nums.length -1];
    let m;

    while (s<=e){
        m = Math.floor((s+e)/2);
        if (nums[m] < value) s = m+1;
        else if (nums[m] > value) e = m -1;
        else return m -1
    }
    return e
}

const [N,M] = inputs[0];
const nums = inputs[1];
nums.sort((a,b)=>(a-b))
const ans = new Array();
for (let i = 2; i< M+2; i ++){
    const [s,e] = inputs[i];
    const value = biSearch(nums,e+1)-biSearch(nums,s);
    ans.push(value)
}
console.log(ans.join('\n'))