Algorithm

[Algorithm] ์•ผ๊ทผ ์ง€์ˆ˜

ghkdu2 2023. 2. 24. 14:32

๋ฌธ์ œ

ํšŒ์‚ฌ์› Demi๋Š” ๊ฐ€๋”์€ ์•ผ๊ทผ์„ ํ•˜๋Š”๋ฐ์š”, ์•ผ๊ทผ์„ ํ•˜๋ฉด ์•ผ๊ทผ ํ”ผ๋กœ๋„๊ฐ€ ์Œ“์ž…๋‹ˆ๋‹ค. ์•ผ๊ทผ ํ”ผ๋กœ๋„๋Š” ์•ผ๊ทผ์„ ์‹œ์ž‘ํ•œ ์‹œ์ ์—์„œ ๋‚จ์€ ์ผ์˜ ์ž‘์—…๋Ÿ‰์„ ์ œ๊ณฑํ•˜์—ฌ ๋”ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. Demi๋Š” N์‹œ๊ฐ„ ๋™์•ˆ ์•ผ๊ทผ ํ”ผ๋กœ๋„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋„๋ก ์ผํ•  ๊ฒ๋‹ˆ๋‹ค.Demi๊ฐ€ 1์‹œ๊ฐ„ ๋™์•ˆ ์ž‘์—…๋Ÿ‰ 1๋งŒํผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ํ‡ด๊ทผ๊นŒ์ง€ ๋‚จ์€ N ์‹œ๊ฐ„๊ณผ ๊ฐ ์ผ์— ๋Œ€ํ•œ ์ž‘์—…๋Ÿ‰ works์— ๋Œ€ํ•ด ์•ผ๊ทผ ํ”ผ๋กœ๋„๋ฅผ ์ตœ์†Œํ™”ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ solution์„ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ ์‚ฌํ•ญ

  • works๋Š” ๊ธธ์ด 1 ์ด์ƒ, 20,000 ์ดํ•˜์ธ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
  • works์˜ ์›์†Œ๋Š” 50000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • n์€ 1,000,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

[4, 3, 3] 4 12
[2, 1, 2] 1 6
[1,1] 3 0

 

 

ํ’€์ด

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

 

๋‘ ๋ฒˆ์งธ ์‹œ๋„๋กœ๋Š” while๋ฌธ์œผ๋กœ n์ด 0 ์ดˆ๊ณผ์ผ๋•Œ ๋Œ์•„๊ฐ€๋„๋ก ํ•˜๊ณ  ๋‚จ์€ ์ž‘์—…๋Ÿ‰๋“ค์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์„œ ์ œ์ผ ์•ž์— ์žˆ๋Š” ๊ฐ’์—์„œ ๋นผ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค๋ฒˆ sort ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ๊ตฌํ˜„ํ–ˆ์—ˆ๋˜ max heap์„ ์‚ฌ์šฉํ–ˆ๋‹ค. while๋ฌธ์ด ์ข…๋ฃŒ๋˜๋ฉด ๋” ์ด์ƒ ๋บ„ ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ ๋นผ์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ƒํ™ฉ์ด๋ฏ€๋กœ heap์— ์กด์žฌํ•˜๋Š” ๊ฐ’์„ answer์— ์ œ๊ณฑํ•ด์„œ ๋„ฃ์–ด์คŒ์œผ๋กœ์„œ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ฝ”๋“œ

class MaxHeap {
  constructor() {
    this.heap = [];
    this.heap.push(1e9);
  }

  insert(value) {
    this.heap.push(value);
    this.upheap(this.heap.length - 1);
  }

  upheap(pos) {
    let temp = this.heap[pos];

    while (temp > this.heap[parseInt(pos / 2)]) {
      this.heap[pos] = this.heap[parseInt(pos / 2)];
      pos = parseInt(pos / 2);
    }
    this.heap[pos] = temp;
  }

  get() {
    if (this.size() === 0) return false;
    if (this.size() === 1) return this.heap.pop();
    const result = this.heap[1];
    this.heap[1] = this.heap.pop();
    this.downheap(1, this.heap.length - 1);
    return result;
  }

  downheap(pos, len) {
    let temp = this.heap[pos],
      child;
    while (pos <= parseInt(len / 2)) {
      child = pos * 2;
      if (child < len && this.heap[child] < this.heap[child + 1]) child++;
      if (temp >= this.heap[child]) break;
      this.heap[pos] = this.heap[child];
      pos = child;
    }
    this.heap[pos] = temp;
  }

  size() {
    return this.heap.length - 1;
  }
}

function solution(n, works) {
  var answer = 0;
  const len = works.length;

  const heap = new MaxHeap();
  for (const work of works) heap.insert(work);

  while (n > 0) {
    let num = heap.get();
    if (!num) return 0;

    heap.insert(num - 1);
    n -= 1;
  }
  for (let i = 1; i < heap.size() + 1; i++) answer += heap.heap[i] ** 2;

  return answer;
}