codeStates front-end/Algorithm

[μ•Œκ³ λ¦¬μ¦˜] μž¬κ·€ ν•¨μˆ˜

ν™˜ν…Œν¬ 2023. 2. 14. 15:12
λ°˜μ‘ν˜•

 

 

 

πŸ“Œ μž¬κ·€

 

 

πŸ“μž¬κ·€μ˜ 이해

 

μž¬κ·€ : μ›λž˜μ˜ 자리둜 λ˜λŒμ•„κ°€κ±°λ‚˜ λ˜λŒμ•„μ˜΄

 

πŸ”— μž¬κ·€μ˜ μ½”λ“œ

 

function recursion () {
  console.log("This is")
  console.log("recursion!")
  recursion()
}

 

recursion() ν•¨μˆ˜?

자기 μžμ‹ μ„ 끝없이 ν˜ΈμΆœν•˜λ©΄μ„œ 같은 μ½”λ“œκ°€ κ³„μ†ν•΄μ„œ μ‹€ν–‰λœλ‹€

 

 

πŸ‘‰πŸΌ 이 ν•¨μˆ˜μ²˜λŸΌ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό μž¬κ·€ ν•¨μˆ˜λΌκ³  ν•œλ‹€

 

 

 

πŸ”—  μž¬κ·€λ‘œ 문제 ν•΄κ²°ν•˜κΈ°

 

문제 : μžμ—°μˆ˜λ‘œ 이루어진 리슀트(λ°°μ—΄)을 μž…λ ₯λ°›κ³ , 리슀트의 합을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ 'arrSum'을 μž‘μ„±ν•˜μ„Έμš”.

 

 

1. 문제λ₯Ό μž‘κ²Œ μͺΌκ°œκΈ°

 

[1, 2, 3, 4, 5] 의 합을 κ΅¬ν•˜λŠ” κ³Όμ •

 

1 + 2 + 3 + 4 + 5 =?

2 + 3 + 4 + 5 =?

3 + 4 + 5 =?

4 + 5 =?

...

 

μœ„ λ°©μ‹μœΌλ‘œ 문제λ₯Ό μͺΌκ° κ²ƒμ„ μ½”λ“œλ‘œ ν‘œν˜„

 

arrSum([1, 2, 3, 4, 5]) === 1 + arrSum([2, 3, 4, 5])
arrSum([2, 3, 4, 5]) === 2 + arrSum([3, 4, 5])
...

 

 

2. 문제λ₯Ό κ°€μž₯ μž‘μ€ λ‹¨μœ„λ‘œ μͺΌκ°œκΈ°

 

...
arrSum([3, 4, 5]) === 3 + arrSum([4, 5])
arrSum([4, 5]) === 4 + arrSum([5])
arrSum([5]) === 5 + arrSum([]) // 더 이상 μͺΌκ°€ 수 μ—†λŠ” μƒνƒœ

 

 

3. 문제 ν•΄κ²°ν•˜κΈ°

 

κ°€μž₯ μž‘μ€ λ‹¨μœ„μ˜ 문제λ₯Ό ν•΄κ²°ν•œ λ°©μ‹μœΌλ‘œ 문제 전체λ₯Ό ν•΄κ²°

 

arrSum([]) === 0; // <-- κ°€μž₯ μž‘μ€ 문제λ₯Ό 빈 λ°°μ—΄μ˜ ν•© 0으둜 리턴
// κ°€μž₯ μž‘μ€ 경우의 해결책을 μ μš©ν•©λ‹ˆλ‹€.
arrSum([5]) === 5 + arrSum([]) === 5 + 0 === 5;
arrSum([4, 5]) === 4 + arrSum([5]) === 4 + 5 === 9;
arrSum([3, 4, 5]) === 3 + arrSum([4, 5]) === 3 + 9 === 12;
arrSum([2, 3, 4, 5]) === 2 + arrSum([3, 4, 5]) === 2 + 12 === 14;
arrSum([1, 2, 3, 4, 5]) === 1 + arrSum([2, 3, 4, 5]) === 1 + 14 === 15;

 

μž‘μ„± μ½”λ“œ

 

function arrSum (arr) {
  // 빈 배열을 λ°›μ•˜μ„ λ•Œ 0을 λ¦¬ν„΄ν•˜λŠ” 쑰건문
  //   --> κ°€μž₯ μž‘μ€ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ½”λ“œ & μž¬κ·€λ₯Ό λ©ˆμΆ”λŠ” μ½”λ“œ
  if (arr.length === 0) {
    return 0
  }

  // λ°°μ—΄μ˜ 첫 μš”μ†Œ + λ‚˜λ¨Έμ§€ μš”μ†Œκ°€ λ‹΄κΈ΄ 배열을 λ°›λŠ” arrSum ν•¨μˆ˜
  //   --> μž¬κ·€(자기 μžμ‹ μ„ 호좜)λ₯Ό 톡해 문제λ₯Ό μž‘κ²Œ μͺΌκ°œλ‚˜κ°€λŠ” μ½”λ“œ
	return arr.shift() + arrSum(arr)
}

 

 

 

πŸ”—  μž¬κ·€ μ‚¬μš© μ˜ˆμ‹œ

 

1. μ£Όμ–΄μ§„ 문제λ₯Ό λΉ„μŠ·ν•œ ꡬ쑰의 더 μž‘μ€ 문제둜 λ‚˜λˆŒ 수 μžˆλŠ” 경우

2. μ€‘μ²©λœ 반볡문이 λ§Žκ±°λ‚˜ 반볡문의 쀑첩 횟수(number of loops)λ₯Ό μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ €μš΄ 경우

 

for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
        for (let k = 0; k < n; k++) {
            for (let l = 0; l < n; l++) {
                for (let m = 0; m < n; m++) {
                    for (let n = 0; n < n; n++) {
                        for (let o = 0; o < n; o++) {
                            for (let p = 0; p < n; p++) {
                                // do something
                                someFunc(i, j, k, l, m, n, o, p);
                           }
                        }
                    }
                }
            }
        }
    }
 }

 

 

 

πŸ“ μž¬κ·€μ˜ ν™œμš©

 

πŸ”—  μž¬κ·€μ μœΌλ‘œ μ‚¬κ³ ν•˜κΈ°

 

 

1. μž¬κ·€ ν•¨μˆ˜μ˜ μž…λ ₯κ°’κ³Ό 좜λ ₯κ°’ μ •μ˜ν•˜κΈ°

 

좔상적, λ˜λŠ” κ°€μž₯ λ‹¨μˆœν•˜κ²Œ μ •μ˜

ν•¨μˆ˜μ˜ μž…μΆœλ ₯값을 μ •μ˜ -> μž¬κ·€ ν•¨μˆ˜λ₯Ό 톡해 λͺ©ν‘œ μ •μ˜

 

2. 문제λ₯Ό μͺΌκ°œκ³  경우의 수λ₯Ό λ‚˜λˆ„κΈ°

 

문제λ₯Ό μͺΌκ°€ 기쀀을 μ •ν•˜κ³ , μ •ν•œ 기쀀에 따라 문제λ₯Ό 더 큰 κ²½μš°μ™€ μž‘μ€ 경우둜 ꡬ뢄

ꡬ뢄 기쀀은 "μž…λ ₯κ°’μ΄λ‚˜ 문제의 μˆœμ„œμ™€ 크기" 이닀

 

 

3. λ‹¨μˆœν•œ 문제 ν•΄κ²°ν•˜κΈ°

 

문제λ₯Ό μ—¬λŸ¬ 경우둜 κ΅¬λΆ„ν•œ λ‹€μŒ, κ°€μž₯ ν•΄κ²°ν•˜κΈ° μ‰¬μš΄ λ¬Έμ œλΆ€ν„° ν•΄κ²°

πŸ‘‰πŸΌ  μž¬κ·€μ˜ 기초

μž¬κ·€μ˜ κΈ°μ΄ˆλŠ” λ‚˜μ€‘μ— μž¬κ·€ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  λ•Œ, μž¬κ·€μ˜ νƒˆμΆœ 쑰건(μž¬κ·€ 호좜이 λ©ˆμΆ”λŠ” 쑰건)을 ꡬ성

νƒˆμΆœ 쑰건이 μ—†λ‹€λ©΄? 끝없이 자기 μžμ‹ μ„ 호좜

 

 

4. λ³΅μž‘ν•œ 문제 ν•΄κ²°ν•˜κΈ°

 

λ‚¨μ•„μžˆλŠ” λ³΅μž‘ν•œ 경우λ₯Ό ν•΄κ²°

 

5. μ½”λ“œ κ΅¬ν˜„

λ°˜μ‘ν˜•