코딩테스트 대비/백준 알고리즘

BOJ - 1654 랜선 자르기

JellyApple 2024. 11. 17. 17:19

1. 문제 : 랜선 자르기

2. 문제 티어: 실버2

3. 문제 유형 : 이진 탐색

4. 문제 풀이 방법

=> 나무 자르기와 동일한 방식으로 이진 탐색으로 최적의 갯수를 찾는 것이 핵심이다.

1) 필요한 변수 값 입력 받음

2) 랜선 잘랐을 때 값을 얻을 수 있는 지 판단하는 함수 작성

3) 이진 탐색으로 최적의 갯수를 카운트하는 함수 작성

4) 결과 출력

 

5. 코드 

1) 필요한 변수 값 입력 받음

// 1. 필요한 값 입력 받음
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
let [N,M] = input[0].split(" ").map(Number);
let lengths = [];

for(let i=1;i<=N;i++){
    lengths.push(input[i]);
 }

 

2) 랜선 잘랐을 때 값을 얻을 수 있는 지 판단할 수 있는 함수 작성

// 2. canCut 함수 작성
function canCut(lengths, target, length) {
    let count = 0;
    for(let i of lengths) {
        count += Math.floor(i / length);
    }
    return count >= target; // true or false로 판별
}

 

3) 이진 탐색으로 최대 랜선 길이를 찾는 함수

function binarySearch(lengths, target){
    let low = 1;
    let high = Math.max(...lengths);
    let result = 0;
    
    while(low <= high) {
        let mid = Math.floor((low + high) / 2);
        if(canCut(lengths, target, mid)){
            result = mid;
            low = mid + 1;
        } else {
            high = mid - 1;
         }
    }
    return result;
 }

 

4) 결과 출력

console.log(binarySearch(lengths,M));

'코딩테스트 대비 > 백준 알고리즘' 카테고리의 다른 글

BOJ - 18353 병사 배치하기  (0) 2024.11.20
BOJ - 10816 숫자 카드 2  (0) 2024.11.17
BOJ - 2805 나무 자르기  (0) 2024.11.17
BOJ - 2512 예산  (0) 2024.10.15
BOJ - 19939 박 터트리기  (4) 2024.10.09