์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[๋ฐฑ์ค€ 2805] ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ (Javascript)

์€์ง„ 2021. 8. 3. 13:15

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๋ฌธ์ œ๋งํฌ

[๋ฐฑ์ค€ 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);