[백준 알고리즘] Node.js 2805. 나무 자르기
2023. 6. 9. 14:22ㆍ코딩연습
1. 문제
https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
2. 풀이
- 입력 첫째줄에는 나무의 수 n 과 적어도 가져가야 하는 미터의 길이인 m이 주어진다.
- 입력 둘째줄에는 나무의 높이가 주어졌다.
- 나무의 높이 중 가장 큰 값을 이용하여 이진 탐색을 이어나가도록 계획했다.
const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const [n,m] = inputs.shift().split(' ').map(v => +v);
// 2번째 줄 나무의 높이
const trees = inputs[0].split(' ').map(v => +v);
// 나무의 높이 중 가장 큰 값
let max = Math.max(...trees);
let min = 1;
let best = 0; // 답이 될 값
while(min <= max){
let mid = Math.floor((max + min) / 2); // 중간 값 찾기
let sum = 0;
// 나무의 높이를 자르고 가져갈 값들을 더해준다.
trees.forEach((tree) => {
if(tree > mid) sum += (tree - mid);
})
// 원하는 길이보다 가져가는 나무의 길이가 더 길다면
if(sum >= m) {
// 그중 가장 긴 값!
if(mid > best) best = mid;
min = mid + 1;
} else { // 짧다면
max = mid - 1;
}
}
console.log(best)
3. 정리
- 이분 탐색은 기준 값들만 잘 설정하면 쉽게 풀 수 있을 것 같다.
* 이진 탐색(Binary Search)
'코딩연습' 카테고리의 다른 글
[백준 알고리즘] Node.js 24445. 알고리즘 수업 - 너비 우선 탐색 2 (0) | 2023.06.15 |
---|---|
[백준 알고리즘] Node.js 24444. 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.06.15 |
[백준 알고리즘] Node.js 2740. 행렬 곱셈 (0) | 2023.06.07 |
[백준 알고리즘] Node.js 11047. 동전 0 (0) | 2023.06.05 |
[백준 알고리즘] Node.js 11399. ATM (0) | 2023.06.05 |