Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[JavaScript/section 7] 12 - ๋งˆ๊ตฌ๊ฐ„ ์ •ํ•˜๊ธฐ

_์„ฑํ˜ธ_ 2022. 10. 12. 13:42
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ 12 - ๋งˆ๊ตฌ๊ฐ„ ์ •ํ•˜๊ธฐ(๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜)

N๊ฐœ์˜ ๋งˆ๊ตฌ๊ฐ„์ด ์ˆ˜์ง์„ ์ƒ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋งˆ๊ตฌ๊ฐ„์€ x1, x2, ..., xN์˜ ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋งˆ๊ตฌ๊ฐ„๊ฐ„์— ์ขŒํ‘œ๊ณผ ์ค‘๋ณต๋˜๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ๋งˆ๊ตฌ๊ฐ„์—๋Š” ํ•œ ๋งˆ๋ฆฌ์˜ ๋ง๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๋ง์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๊ฒŒ ๋ง์„ ๋งˆ๊ตฌ๊ฐ„์— ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. C๋งˆ๋ฆฌ์˜ ๋ง์„ N๊ฐœ์˜ ๋งˆ๊ตฌ๊ฐ„์— ๋ฐฐ์น˜ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๋ง์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ทธ ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•ด๋ณด์ž!

์ž…๋ ฅ์„ค๋ช…

์ฒซ ์ค„์— ์ž์—ฐ์ˆ˜ N๊ณผ C๊ฐ€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์— ๋งˆ๊ตฌ๊ฐ„์˜ ์ขŒํ‘œ๊ฐ€ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ์„ค๋ช…

์ฒซ ์ค„์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๋ง์˜ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ž…๋ ฅ์˜ˆ์ œ
5 3
1 2 8 4 9

์ถœ๋ ฅ์˜ˆ์ œ
3

 

๐Ÿ‘ ํ’€์ด ๋ฐฉ๋ฒ•

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๋ง์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ทธ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋งˆ๊ตฌ๊ฐ„์— ๋ง 3๋งˆ๋ฆฌ๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ํ•œ๊ฐ€์ง€ ์ด์ƒ์ด์ง€๋งŒ ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ๋ง์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ์ตœ์ ์˜ ๊ฐ’์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํŠน์ •ํ•œ ์ƒํ™ฉ์—์„œ ์ตœ์ ์˜ ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด๋ถ„ ํƒ์ƒ‰์„ ์ด์šฉํ•œ ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉฐ ๋Š๋‚€ ์ ์€ ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์–ด์ง„ ์ผ๋ จ์˜ ๊ฐ’๋“ค์ด ์•„๋‹ˆ๋ผ ์ฃผ์–ด์ง„ ๋ฒ”์œ„์— ํฌ์ปค์Šค๋ฅผ ๋งž์ถฐ์„œ ํ’€์–ด์•ผ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  • ๋งˆ๊ตฌ๊ฐ„์˜ ์ขŒํ‘œ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  • lt(๋ง ์‚ฌ์ด์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ)๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. stable[0] ๊ฐ’์ด 1์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—” ์›ํ•˜๋Š” ๋‹ต์„ ์–ป์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ stable[0]์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. 
  • rt(๋ง ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ)๋ฅผ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • mid(๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ง ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ)๋ฅผ Math.floor((lt + rt) / 2)๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (์ด๋ถ„ ํƒ์ƒ‰)
  • count() ํ•จ์ˆ˜๋Š” mid(๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ง ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ)๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋ง ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ ๋งˆ๊ตฌ๊ฐ„์— ๋ช‡๋งˆ๋ฆฌ์˜ ๋ง์ด ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. mid๊ฐ€ ์ž‘์„ ์ˆ˜๋ก ๋” ๋งŽ์€ ๋ง์ด ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ๋‹ค.
  • count() ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์ด 3๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋ฏ€๋กœ answer์— mid๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— mid ์ดํ•˜์˜ ๊ฐ’๋“ค์€ ํƒ์ƒ‰์—์„œ ์ œ์™ธ๋œ๋‹ค. lt = mid + 1
  • ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์ด 3๋ณด๋‹ค ์ž‘๋‹ค๋ฉด mid ์ด์ƒ์˜ ๊ฑฐ๋ฆฌ๋“ค ๋˜ํ•œ 3๋งˆ๋ฆฌ ์ด์ƒ์˜ ๋ง๋“ค์ด ๋ฐฐ์น˜๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํƒ์ƒ‰์—์„œ ์ œ์™ธ๋œ๋‹ค. rt = mid - 1

 

๐Ÿ“ ์†Œ์Šค์ฝ”๋“œ

function count(stable, dist) {
  let cnt = 1;
  //์ฒซ ๋ฒˆ์งธ ์ขŒํ‘œ์— ๋ง ๋ฐฐ์น˜
  horse = stable[0];

  for (let i = 1; i < stable.length; i++) {
    // ํ•ด๋‹น ์œ„์น˜์—์„œ ๋ง์˜ ์ฒ˜์Œ ์œ„์น˜๋ฅผ ๋บ๋Š”๋ฐ ํ˜„์žฌ ์ •ํ•ด์ง„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ง ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ(dist)๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด cnt++
    // ๋ง์˜ ์œ„์น˜๋ฅผ ํ•ด๋‹น ์œ„์น˜๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ง์„ ๋” ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ„์†ํ•ด์„œ ๋น„๊ต
    if (stable[i] - horse >= dist) {
      cnt++;
      // ๋ง ์žฌ๋ฐฐ์น˜
      horse = stable[i];
    }
  }

  return cnt;
}

function solution(c, stable) {
  let answer;
  stable.sort((a, b) => a - b);
  // lt - ๋ง ์‚ฌ์ด์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ, rt - ๋ง ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ
  let lt = 1,
    rt = stable[stable.length - 1];

  while (lt <= rt) {
    // mid - ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ง ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ
    let mid = Math.floor((lt + rt) / 2);
    // ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ง์˜ ๊ฐœ์ˆ˜๊ฐ€ c๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด lt์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์„œ ํƒ์ƒ‰
    // c๋ณด๋‹ค ์ž‘๋‹ค๋ฉด rt์˜ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์„œ ํƒ์ƒ‰
    if (count(stable, mid) >= c) {
      answer = mid;
      // ๋” ์ข‹์€ ๋‹ต์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ
      lt = mid + 1;
    } else rt = mid - 1;
  }

  return answer;
}

let arr = [1, 2, 8, 4, 9];
console.log(solution(3, arr));