๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

CS/์•Œ๊ณ ๋ฆฌ์ฆ˜

ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ •์˜


  • ํˆฌ ํฌ์ธํ„ฐ(Two Pointer) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€, ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜์—์„œ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฒ”์œ„๋ฅผ ์กฐ์ ˆํ•ด๊ฐ€๋ฉฐ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
  • ํŠนํžˆ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๋ฐฐ์—ด์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋ถ€๋ถ„์„ ๋™์‹œ์— ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n), ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด ๋œ๋‹ค.
    ๋Ÿฐํƒ€์ž„์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ์ 


  1. ํฌ์ธํ„ฐ์˜ ์ดˆ๊ธฐ ์œ„์น˜ ์„ค์ •
    • ํฌ์ธํ„ฐ๋ฅผ ์–ด๋””์„œ ์‹œ์ž‘ํ•˜๊ณ  ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ๋น„๊ตํ•  ๊ฒƒ์ธ๊ฐ€?
  2. ํฌ์ธํ„ฐ์˜ ์ด๋™ ๋ฐฉํ–ฅ๊ณผ ์กฐ๊ฑด
    • ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๊ฒƒ์ธ๊ฐ€, ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๊ฒƒ์ธ๊ฐ€?
    • ํฌ์ธํ„ฐ๋ฅผ ์–ธ์ œ ์›€์ง์ผ ๊ฒƒ์ธ๊ฐ€?
  3. ํฌ์ธํ„ฐ์˜ ์ค‘์ง€ ์กฐ๊ฑด
    • ํฌ์ธํ„ฐ๋ฅผ ์–ธ์ œ ๋ฉˆ์ถœ ๊ฒƒ์ธ๊ฐ€?
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด์˜ ๋ฐ˜๋ณต์ด ๋๋‚  ๋•Œ๋‚˜ ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๊ต์ฐจํ•  ๋•Œ ์ค‘์ง€๋œ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹


1. ๊ฐ™์€ ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ

  • ๋‘ ํฌ์ธํ„ฐ ์ค‘ ํ•˜๋‚˜๋Š” ๋А๋ฆฐ ์†๋„๋กœ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋น ๋ฅธ ์†๋„๋กœ ์ด๋™ํ•œ๋‹ค.
  • e.g. ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต ์š”์†Œ ์ œ๊ฑฐ, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์‚ฌ์ดํด

https://cdragon.medium.com/basics-of-two-pointers-technique-e1a0df57ba7e

2. ์—ญ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ

  • ๋‘ ํฌ์ธํ„ฐ ์ค‘ ํ•˜๋‚˜๋Š” ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋งจ ๋๋ถ€ํ„ฐ ์ด๋™ํ•œ๋‹ค.
  • e.g. ํŒฐ๋ฆฐ๋“œ๋กฌ(ํšŒ๋ฌธ)

https://cdragon.medium.com/basics-of-two-pointers-technique-e1a0df57ba7e

์†Œ์Šค ์ฝ”๋“œ (JS)


1. ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต๋˜๋Š” ์š”์†Œ ์ œ๊ฑฐํ•˜๊ธฐ

  • ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•œ๋‹ค.
/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
  let j = 0;

  for (let i = 1; i < nums.length; i++) {
    if (nums[j] !== nums[i]) {
      j += 1;
      nums[j] = nums[i];
    }
  }
  return j + 1;
};

2. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์‚ฌ์ดํด

  • ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋Š” ๋А๋ฆฌ๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋Š” ๋น ๋ฅด๋‹ค.
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function (head) {
  let slow = head;
  let fast = head;

  while (fast && fast.next) {
    slow = slow.next;
    fast = fast.next.next;

    if (slow === fast) {
      return true;
    }
  }
  return false;
};

3. ํŒฐ๋ฆฐ๋“œ๋กฌ

  • ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋Š” ๋ฌธ์ž์—ด์˜ ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋Š” ๋ฌธ์ž์—ด์˜ ๋งจ ๋๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.
/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function (s) {
  // ๊ณต๋ฐฑ์ œ๊ฑฐ, ์†Œ๋ฌธ์ž ์˜๋ฌธ์œผ๋กœ ๋ณ€ํ™˜, ์˜์ˆซ์ž๋งŒ ๊ฐ€๋Šฅ
  const formatted = s
    .split("")
    .filter((ch) => isAlphabetOrNumeric(ch))
    .join("")
    .toLowerCase();

  let left = 0;
  let right = formatted.length - 1;

  while (left <= right) {
    if (formatted[left] !== formatted[right]) {
      return false;
    }
    left++;
    right--;
  }
  return true;
};

function isAlphabetOrNumeric(ch) {
  const code = ch.charCodeAt(0);
  return (
    (code >= 48 && code <= 57) ||
    (code >= 65 && code <= 90) ||
    (code >= 97 && code <= 122)
  );
}

์ฐธ๊ณ 


  • Geeks for Geeks
    • Two Pointers Technique
  • ๋ธ”๋กœ๊ทธ
    • Basics of Two Pointers Technique
    • Two Pointers & Sliding Window
  • ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ
    • ๋ฆฌํŠธ์ฝ”๋“œ 26๋ฒˆ Remove Duplicates from Sorted Array
    • ๋ฆฌํŠธ์ฝ”๋“œ 125๋ฒˆ Valid Palindrome
    • ๋ฆฌํŠธ์ฝ”๋“œ 141๋ฒˆ Linked List Cycle