๐ฉ๐ปโ๐ป๋ฌธ์ ๋งํฌ
[๋ฐฑ์ค 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);