🀘 투 포인터

경이·2024λ…„ 9μ›” 2일
post-thumbnail

🀘 투 포인터

  • λ¬Έμžμ—΄μ΄λ‚˜ 1차원 λ°°μ—΄(리슀트)μ—μ„œ μ‚¬μš©λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜
  • 각각 λ‹€λ₯Έ μ›μ†Œλ₯Ό κ°€λ₯΄ν‚€λŠ” 두 개의 포인터λ₯Ό μ‚¬μš©ν•΄ λ°°μ—΄μ΄λ‚˜ λ¬Έμžμ—΄μ„ μˆœνšŒν•˜μ—¬ λͺ©ν‘œκ°’을 μ°ΎλŠ”λ‹€.
  • λΆ€λΆ„ λ°°μ—΄μ˜ ν•©(ꡬ간합)μ΄λ‚˜, λ‹€λ₯Έ μœ„μΉ˜μ— μžˆλŠ” μ›μ†Œκ°’μ„ μ΄μš©ν•œ 값을 κ΅¬ν• λ•Œ μ‚¬μš©ν•œλ‹€.
  • 완전탐색인 O(n2) μ†”λ£¨μ…˜μ„ O(n)으둜 κ°œμ„ μ‹œν‚¨λ‹€.

🀘 ꡬ간 ν•© 문제

νˆ¬ν¬μΈν„°μ˜ λŒ€ν‘œ 문제인 ꡬ간 ν•© 문제λ₯Ό ν’€μ–΄λ³΄μž!

λ‹€μŒ λ°°μ—΄μ—μ„œ μ›μ†Œλ“€μ˜ 합이 x인 λΆ€λΆ„ λ°°μ—΄μ˜ 개수λ₯Ό κ΅¬ν•˜μ—¬λΌ
arr = [ 1, 3, 6, 5, 2, 7, 9 ], x = 9
λ‹΅ : 3개 {3,6}, {2,7}, {9}

  • 완전탐색 풀이 : μ‹œκ°„λ³΅μž‘λ„ O(n2)
    const solution = (arr, x) => {
      let cnt = 0;
      for (let i = 0; i < arr.length; i++) {
        let sum = 0;
        for (let j = i; j < arr.length; j++) {
          sum += arr[j];
          if (sum > x) {
            break;
          } else if (sum == x) {
            cnt++;
            break;
          }
        }
      }
      return cnt;
    }
    μœ„ μ½”λ“œμ˜ 경우 depthκ°€ 2인 반볡문이 μ‚¬μš©λ˜λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n2)κ°€ λœλ‹€. 이λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ 투 포인터λ₯Ό μ μš©ν•œλ‹€.
  • νˆ¬ν¬μΈν„° 풀이 : μ‹œκ°„λ³΅μž‘λ„ O(n)
    const solution = (arr, x) => {
      let cnt= 0;
      let sum = 0;
      let left = 0;
      let right = 0;
      while(right <= arr.length){
        if(sum === x){
          cnt += 1
          sum -= arr[left]
          left += 1
        }else if(sum < x){
          sum += arr[right]
          right += 1
        }else if(sum > x){
          sum -= arr[left]
          left += 1
        }
      }
      return cnt;
    }
    μœ„ μ½”λ“œμ˜ 경우 left와 rightλΌλŠ” 두 개의 포인트λ₯Ό μ„€μ •ν•΄λ‘”λ‹€. ꡬ간 합이기 λ•Œλ¬Έμ— 두 κ°’μ˜ μ‹œμž‘μ μ€ 0λΆ€ν„° μ‹œμž‘ν•œλ‹€.
    • right 값이 arr의 끝에 도달할 λ•ŒκΉŒμ§€ λ‘κ°œμ˜ 포인터 값을 μ‘°μ •ν•˜λ©° μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰ν•œλ‹€.
    • λ§Œμ•½ λͺ©ν‘œκ°’인 x와 sum이 λ™μΌν•˜λ‹€λ©΄ κ΅¬κ°„ν•©μ˜ 개수 cntλ₯Ό 1 μ¦κ°€μ‹œμΌœ μ£Όκ³ , λ˜λ‹€λ₯Έ ꡬ간합을 μ°ΎκΈ° μœ„ν•΄ left값을 1 μ¦κ°€μ‹œμΌœμ€€λ‹€. left값을 1 μ¦κ°€μ‹œμΌ°μœΌλ‹ˆ sumμ—μ„œλ„ arr[left]의 값을 μ œκ±°ν•œλ‹€.
    • λ§Œμ•½ λͺ©ν‘œκ°’인 x보닀 sum이 μž‘λ‹€λ©΄ right 값을 1μ¦κ°€μ‹œν‚€κ³  ꡬ간합에 arr[right]값을 ν¬ν•¨ν•œλ‹€.
    • λ§Œμ•½ λͺ©ν‘œκ°’인 x보닀 sum이 크닀면 left 값을 1 κ°μ†Œμ‹œν‚€κ³  ꡬ간합에 arr[left]값을 μ œκ±°ν•œλ‹€.
    arr.length만큼 λ°˜λ³΅ν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)

투 ν¬μΈν„°λŠ” 투 ν¬μΈν„°λŠ” μ •λ ¬ μˆ˜ν–‰ 여뢀와 음수 μ–‘μˆ˜ 등을 κ³ λ €ν•˜μ—¬ 상황에 맞게 쑰건을 μ„Έμš°λŠ” 것이 μ€‘μš”ν•˜λ‹€.


🀘 νˆ¬ν¬μΈν„° 문제 μΆ”μ²œ


🀘 Ref

profile
둝타λ₯΄μ˜€κ°€λ₯΄

0개의 λŒ“κΈ€