Skip to content

Conversation

@oh-chaeyeon
Copy link
Contributor

๐Ÿ“Œ ํ‘ผ ๋ฌธ์ œ


๐Ÿ“ ๊ฐ„๋‹จํ•œ ํ’€์ด ๊ณผ์ •

56. Merge Intervals

  • ๋ฌธ์ œ ์„ค๋ช… : ์ฃผ์–ด์ง„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌ๊ฐ„์—์„œ ๊ฒน์น˜๋Š” ๊ตฌ๊ฐ„๋“ค์„ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ฒน์น˜์ง€ ์•Š๋Š” ๊ตฌ๊ฐ„์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ
  • ํ’€์ด ์„ค๋ช… : ์ฃผ์–ด์ง„ ๊ตฌ๊ฐ„์„ ์‹œ์ž‘๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ ํ›„, ๊ฐ ๊ตฌ๊ฐ„์„ ์ˆœํšŒํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰ ๊ตฌ๊ฐ„๊ณผ ๊ฒน์น˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ฒน์นœ๋‹ค๋ฉด ๋ ๊ฐ’์„ ๋ณ‘ํ•ฉํ•˜๊ณ , ๊ฒน์น˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ๊ตฌ๊ฐ„์„ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ๊ตฌ๊ฐ„๋“ค์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์œผ๋กœ.
var merge = function (intervals) {
  if (intervals.length === 0) return [];
  intervals.sort((a, b) => a[0] - b[0]); // ์‹œ์ž‘๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ถ€๋ถ„

  const merged = [intervals[0]];

  for (let i = 1; i < intervals.length; i++) {
    const current = intervals[i];

    // ํ˜„์žฌ ๊ตฌ๊ฐ„์ด ๋งˆ์ง€๋ง‰ ๊ตฌ๊ฐ„๊ณผ ๊ฒน์น˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ฒน์นœ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๊ตฌ๊ฐ„์˜ ๋ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ
    if (current[0] <= merged[merged.length - 1][1]) {
      merged[merged.length - 1][1] = Math.max(
        merged[merged.length - 1][1],
        current[1]
      );
    } else { // ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํ˜„์žฌ ๊ตฌ๊ฐ„์„ ์ถ”๊ฐ€
      merged.push(current);
    }
  }

  return merged;
};

1584. Min Cost to Connect all points

(๋ฌธ์ œ ํ’€๋‹ค๊ฐ€ ์ฑ—๊ณผ ํ•จ๊ผํ•˜๋Š” ์‹œ๊ฐ„์œผ๋กœ.. ๋„์›€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.)

  • ๋ฌธ์ œ ์„ค๋ช… : ์ฃผ์–ด์ง„ ์—ฌ๋Ÿฌ ์ ๋“ค์„ ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ชจ๋“  ์ ์ด ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ
  • ์ ‘๊ทผ๋ฒ• : ์ ๋“ค์„ ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ ๊นŒ์ง€์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์  ์ค‘ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ์ ์„ ์„ ํƒํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ „์ฒด ๋น„์šฉ์„ ๋ˆ„์ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ ์ด ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์ตœ์†Œ ๋น„์šฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋งค ๋‹จ๊ณ„์—์„œ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ€์ค‘์น˜์˜ ๊ฐ„์„ ์„ ์„ ํƒํ•˜์—ฌ ์ •์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์ค‘์น˜(weight) ๋ž€? ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ ๊ฐ„์„ ์ด๋‚˜ ๋…ธ๋“œ์— ๋ถ€์—ฌ๋œ ๊ฐ’์œผ๋กœ, ์ฃผ๋กœ ๊ฑฐ๋ฆฌ, ๋น„์šฉ, ์‹œ๊ฐ„ ๋“ฑ๊ณผ ๊ฐ™์€ ํŠน์ •ํ•œ ์–‘
  • ๊ฐ„์„  ๊ฐ€์ค‘์น˜ : ๋‘ ๋…ธ๋“œ(์ •์ ) ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ„์„ ์— ๋ถ€์—ฌ๋œ ๊ฐ’. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ๋„์‹œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ, ๋‘ ์ž‘์—… ๊ฐ„์˜ ์†Œ์š” ์‹œ๊ฐ„ ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Œ.

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘๋™๋ฐฉ์‹

  1. ์‹œ์ž‘ ์ •์  ์„ ํƒ : ๊ทธ๋ž˜ํ”„์˜ ์ž„์˜์˜ ์ •์ ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ€์ค‘์น˜ ๊ฐ„์„  ์„ ํƒ : ํ˜„์žฌ ์„ ํƒ๋œ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ค‘์—์„œ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด(๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€) ๊ฐ„์„ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ„์„ ์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฐ˜๋ณต : ์ถ”๊ฐ€๋œ ์ •์ ์—์„œ ๋‹ค์‹œ ์ธ์ ‘ํ•œ ๊ฐ„์„ ๋“ค์„ ํ™•์ธํ•˜๊ณ , ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ€์ค‘์น˜์˜ ๊ฐ„์„ ์„ ์„ ํƒํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ •์ ์„ ๊ณ„์† ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค .
  4. ์ข…๋ฃŒ ์กฐ๊ฑด : ๋ชจ๋“  ์ •์ ์ด ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
var minCostConnectPoints = function(points) {
    const n = points.length; // ์ ์˜ ๊ฐœ์ˆ˜
    const dist = new Array(n).fill(Infinity); // ๊ฐ ์ ๊นŒ์ง€์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ ์ดˆ๊ธฐํ™”
    const visited = new Array(n).fill(false); // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ๋ฐฐ์—ด
    dist[0] = 0; // ์ฒซ ๋ฒˆ์งธ ์ ์˜ ๊ฑฐ๋ฆฌ 0์œผ๋กœ ์„ค์ •
    let cost = 0; // ์ด ๋น„์šฉ ์ดˆ๊ธฐํ™”

    for (let i = 0; i < n; i++) {
        let minCost = Infinity; // ์ตœ์†Œ ๊ฑฐ๋ฆฌ ์ดˆ๊ธฐํ™”
        let currentNode = -1; // ํ˜„์žฌ ์„ ํƒ๋œ ์ 

        // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์  ์ค‘์—์„œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ์  ์„ ํƒ
        for (let j = 0; j < n; j++) {
            if (!visited[j] && dist[j] < minCost) {
                minCost = dist[j];
                currentNode = j;
            }
        }

        visited[currentNode] = true; // ์„ ํƒ๋œ ์  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        cost += minCost; // ์ด ๋น„์šฉ์— ์ถ”๊ฐ€

        // ์„ ํƒ๋œ ์ ๊ณผ ๋‹ค๋ฅธ ์ ๋“ค ๊ฐ„์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋ฐ ์—…๋ฐ์ดํŠธ
        for (let nextNode = 0; nextNode < n; nextNode++) {
            if (!visited[nextNode]) {
                const manhattanDistance = Math.abs(points[currentNode][0] - points[nextNode][0]) +
                                          Math.abs(points[currentNode][1] - points[nextNode][1]);
                dist[nextNode] = Math.min(dist[nextNode], manhattanDistance); // ์ตœ์†Œ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ
            }
        }
    }

    return cost; // ์ตœ์†Œ ๋น„์šฉ ๋ฐ˜ํ™˜
};

235. Lowest Common ancestor of a Binary Search Tree

  • ๋ฌธ์ œ ์„ค๋ช… : ์ฃผ์–ด์ง„ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ ๋‘ ๋…ธ๋“œ์˜ ์ตœ์†Œ ๊ณตํ†ต ์กฐ์ƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ
  • ์ ‘๊ทผ : ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ํŠน์„ฑ ์ด์šฉ -> ์™ผ์ชฝ ์ž์‹์˜ ๊ฐ’์ด ๋ถ€๋ชจ๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ๊ฐ’์ด ๋ถ€๋ชจ๋ณด๋‹ค ํฌ๋‹ค๋Š” ์„ฑ์งˆ
var lowestCommonAncestor = function (root, p, q) {
  while (root) {
    if (p.val < root.val && q.val < root.val) { // p์™€ q๊ฐ€ ํ˜„์žฌ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ์œผ๋กœ ์ด๋™
      root = root.left;
    } else if (p.val > root.val && q.val > root.val) {  // p์™€ q๊ฐ€ ํ˜„์žฌ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
      root = root.right;
    } else {
      return root; // p์™€ q๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ชฝ์— ์žˆ์œผ๋ฉด ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ตœ์†Œ ๊ณตํ†ต ์กฐ์ƒ์ž„
    }
  }
  return null; 
};

139. Word Break

  • ๋ฌธ์ œ : ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด s๋ฅผ ์‚ฌ์ „์˜ ๋‹จ์–ด๋“ค๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ
  • ์ ‘๊ทผ : ๋˜ ๋งŒ๋‚œ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ,, ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์‚ฌ์ „์˜ ๋‹จ์–ด๋กœ ๋‚˜๋ˆ„๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๋กœ์ง์œผ๋กœ, dp ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด ๊ฐ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•จ.
var wordBreak = function (s, wordDict) {
  const wordSet = new Set(wordDict);
  const dp = new Array(s.length + 1).fill(false);
  dp[0] = true; // ๋นˆ ๋ฌธ์ž์—ด์€ ํ•ญ์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ

  for (let i = 1; i <= s.length; i++) {
    for (const word of wordSet) {
      const wordLength = word.length;

      //ํ˜„์žฌ ์ธ๋ฑ์Šค์—์„œ ๋‹จ์–ด๋ฅผ ๋บ€ ์ธ๋ฑ์Šค๊ฐ€ ์œ ํšจํ•˜๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์ด ๋‹จ์–ด์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
      if (
        i >= wordLength &&
        dp[i - wordLength] &&
        s.substring(i - wordLength, i) === word
      ) {
        dp[i] = true;  //๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉด true๋กœ ์„ค์ •
        break;
      }
    }
  }

  return dp[s.length];
};

215. Kth largest element in an Array

  • ๋ฌธ์ œ : ์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด nums์—์„œ k๋ฒˆ์งธ๋กœ ํฐ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ
  • ์ ‘๊ทผ : ์›๋ž˜๋Š” heap์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”๋ฐ, ๋Ÿฐํƒ€์ž„์ด 148~183ms๊นŒ์ง€ ๋‚˜์™€์„œ heap์œผ๋กœ ๋Ÿฐํƒ€์ž„์„ 100ms์ดํ•˜๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์ผ๋Š”๋ฐ,,์•ˆ๋˜์„œ ์ฑ—GPT ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ํ’€์ด๋ฐฉ๋ฒ•์„ ์ฐพ๋‹ค๊ฐ€ ์ˆ˜์ •ํ•œ ํ’€์ด๊ฐ€ ๋ฐ‘์— ์žˆ๋Š” ํ’€์ด์ž…๋‹ˆ๋‹ค.

Heap ์ด์šฉํ•ด์„œ ํ•œ ํ’€์ด

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    const maxHeap = new MaxPriorityQueue();

    for (const num of nums) {
        maxHeap.enqueue(num);
    }
    
    for (let i = 0; i < k - 1; i++) {
        maxHeap.dequeue();
    }
    return maxHeap.front().element; 
};

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ๊ฐ’์ด -10,000๋ถ€ํ„ฐ 10,000๊นŒ์ง€ ์žˆ๊ธฐ์—, ๊ณ„์ˆ˜ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•œ ํ’€์ด

  • ํ’€์ด : ๊ณ„์ˆ˜ ์ •๋ ฌ์„ ํ™œ์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์˜ ๋นˆ๋„๋ฅผ ๊ธฐ๋กํ•œ ํ›„, ์—ญ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•˜์—ฌ k๋ฒˆ์งธ๋กœ ํฐ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

  • ๊ณ„์ˆ˜ ์ •๋ ฌ : ์ •์ˆ˜์˜ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋œ ๊ฒฝ์šฐ์— ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€ ๋ช‡ ๋ฒˆ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ์„ธ์–ด์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•จ.

  • ์˜คํ”„์…‹ : ํŠน์ • ๊ฐ’์— ์ผ์ •ํ•œ ์ˆ˜๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ฃผ๋กœ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋  ๋•Œ, ์ด๋ฅผ ์–‘์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ.

var findKthLargest = function (nums, k) {
  const offset = 10000; // ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ์˜คํ”„์…‹
  const count = new Array(20001).fill(0);  // ๋นˆ๋„ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”

  // ๊ฐ ์ˆซ์ž์˜ ๋นˆ๋„๋ฅผ ๊ธฐ๋ก
  for (let num of nums) {
    count[num + offset]++;  // ๊ฐ ์ˆซ์ž์˜ ๋นˆ๋„ ์ฆ๊ฐ€
  }

  let total = 0;

  // ๋ฐฐ์—ด์„ ์—ญ์ˆœ์œผ๋กœ ํƒ์ƒ‰
  for (let i = count.length - 1; i >= 0; i--) {
    total += count[i];  // ๋นˆ๋„ ๋ˆ„์ 
    if (total >= k) return i - offset;  // k๋ฒˆ์งธ ํฐ ์š”์†Œ ๋ฐ˜ํ™˜
  }
};

@oh-chaeyeon oh-chaeyeon self-assigned this Nov 26, 2024
@oris8 oris8 requested review from heony704 and ynot0117 November 26, 2024 15:37
@oris8 oris8 merged commit c016196 into master Dec 2, 2024
3 checks passed
JooKangsan pushed a commit that referenced this pull request Dec 3, 2024
* 56 / Merge Intervals / Medium / 23m 25s

* 1584 / Min Cost to Connect all points / Medium / 1h+

* 235 / Lowest Common ancestor of a Binary Search Tree / Medium / 9m 37s

* 139 / Word Break / Medium / 12m 49s

* 215 / Kth largest element in an Array / Medium / 30m+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants