๐ฉ๐ปโ๐ป๋ฌธ์ ๋งํฌ
[๋ฐฑ์ค 2805] ๋๋ฌด ์๋ฅด๊ธฐ (Javascript)
โ๏ธIdea Sketch
2021-07-19
1. ๋ก์ง : ์ด๋ถ ํ์
- input ์ ๋ ฌ
- ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์
- ์ต์๊ฐ : left = 0;
- ์ต๋๊ฐ : right = input[input.length-1]; // ๋ง์ง๋ง ์์์ด์ ๊ฐ์ฅ ํฐ ์์
- mid๋ก ์ ๋จ๊ธฐ ์ค์ ํ์ ๋, ๋ช๋ฏธํฐ์ ๋๋ฌด๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์๋์ง ํ์ธํ๋ ํจ์
- ๋๋ฌด๊ฐ ๋๋ํ ๊ฒฝ์ฐ, right = mid-1;
- ๋๋ฌด๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ, left = mid+1;
2. mid๋งํผ ๋๋ฌด๋ฅผ ์ ๋จํ๋ค ๊ฐ์ ํ์ ๋, ์๊ทผ์ด๊ฐ ๊ฐ์ ธ๊ฐ๋ ๋๋ฌด ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ํจ์
๊ฐ์ ธ๊ฐ ์ ์๋ ๋๋ฌด ๊ธธ์ด > ์ฑ๊ธธ ๋๋ฌด ๊ธธ์ด
--> ๋์ด๋ฅผ ๋์ฌ์ผ์ง --> left = mid+1;๊ฐ์ ธ๊ฐ ์ ์๋ ๋๋ฌด ๊ธธ์ด < ์ฑ๊ธธ ๋๋ฌด ๊ธธ์ด
--> ๋์ด๋ฅผ ๋ฎ์ถฐ์ผ์ง --> right = mid-1;
while (left <= right) {
let mid = parseInt((left + right) / 2);
let tree = getTree(mid);
if (tree === M) return mid;
else if (tree > M) left = mid + 1;
else right = mid - 1;
}
3. ๊ฐ์ ธ๊ฐ ์ ์๋ ๋๋ฌด ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ํจ์ --> reduce() ์ฌ์ฉ
function getTree (mid) {
let sum = input.reduce((a, b) => {
if (b > mid) return a+b-mid;
return a;
}, 0);
return sum;
}
4. ๋ฐ๋ก ํ์ธ ๋งํฌ
- ๋ฐ๋์ ๋ฑ M๋งํผ๋ง ์ฑ๊ฒจ๊ฐ ์๋ ์๋ค. M๋ณด๋ค ๋ ๋ง์ด ์ฑ๊ฒจ์ผํ๋ ํ ์คํธ์ผ์ด์ค๊ฐ ์กด์ฌํ๋ค.
2 11
10 10
- ๋ต : 4
โ๏ธ์์ค์ฝ๋
2021-07-19 ํต๊ณผ
const fs = require('fs');
const stdin = (process.platform === 'linux'
? fs.readFileSync('/dev/stdin').toString()
: `5 20
4 42 40 26 46`
).split('\n');
let [N, M] = stdin[0].split(' ').map(Number);
let input = stdin[1].split(' ').map(Number).sort((a, b) => a-b);
function getTree (mid) {
let sum = input.reduce((a, b) => {
if (b > mid) return a+b-mid;
return a;
}, 0);
return sum;
}
// ๋ณธ๋ก
let left = 0, right = input[input.length - 1];
let result = 0;
while (left <= right) {
let mid = parseInt((left + right) / 2);
let tree = getTree(mid);
if (tree === M) {
result = mid;
break;
}
else if (tree > M) {
if (result < mid) result = mid; // ๋ฐ๋ก
left = mid + 1;
}
else right = mid - 1;
}
console.log(result);