λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ–₯ CS/Algorithm

[Algorithm/Swift] 동적 κ³„νšλ²•(Dynamic Programming)

μ•ˆλ…•ν•˜μ„Έμš” μ œμΈμž…λ‹ˆλ‹€!

μ˜€λŠ˜μ€ μ•Œκ³ λ¦¬μ¦˜ κ°œλ… 쀑 동적 κ³„νšλ²•(Dynamic Programming)에 λŒ€ν•΄ 정리해보렀고 ν•©λ‹ˆλ‹€.

동적 κ³„νšλ²•μ΄ 무엇인지 정리해보고, 동적 κ³„νšλ²•μ˜ λŒ€ν‘œμ μΈ 예제인 <ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄> 문제λ₯Ό 톡해 μ μš©κΉŒμ§€ 해보도둝 ν• κ²Œμš”!

동적 κ³„νšλ²•(Dynamic Programming, DP)

λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(μ€„μ—¬μ„œ DP)라고도 λΆˆλ¦¬λŠ” 동적 κ³„νšλ²•μ€ 큰 문제λ₯Ό μž‘κ²Œ λ‚˜λˆ„κ³ , 같은 문제라면 ν•œ λ²ˆμ”©λ§Œ ν’€μ–΄ 문제λ₯Ό 효율적으둜 ν•΄κ²°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ κΈ°λ²•μž…λ‹ˆλ‹€.

동적 κ³„νšλ²•μ—μ„œλŠ” λ©”λͺ¨μ΄μ œμ΄μ…˜(Memoization) 기법이 핡심이라고 ν•  수 μžˆλŠ”λ°μš”!

λ©”λͺ¨μ΄μ œμ΄μ…˜ κΈ°λ²•μ΄λž€, ν•œ 번 κ΅¬ν•œ κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯해두고 같은 식을 λ‹€μ‹œ ν˜ΈμΆœν•΄ μ €μž₯ν•œ κ²°κ³Όλ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ˜€λŠ” 기법을 μ˜λ―Έν•©λ‹ˆλ‹€. λ©”λͺ¨μ΄μ œμ΄μ…˜μ€ 값을 μ €μž₯ν•˜λŠ” λ°©λ²•μ΄λ―€λ‘œ 캐싱(Caching)이라고도 ν•©λ‹ˆλ‹€.

동적 κ³„νšλ²•μ€ λ©”λͺ¨μ΄μ œμ΄μ…˜ 기법을 ν™œμš©ν•΄ λ™μΌν•œ 계산을 λ°˜λ³΅ν•΄μ•Όν•  λ•Œ, 이전에 κ³„μ‚°ν•œ 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜μ—¬ 반볡 μˆ˜ν–‰μ„ μ œκ±°ν•˜μ—¬ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 속도λ₯Ό λΉ λ₯΄κ²Œ ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 곡간을 μ•½κ°„ 더 μ‚¬μš©ν•˜λ©΄μ„œ μ—°μ‚° 속도λ₯Ό λΉ„μ•½μ μœΌλ‘œ μ¦κ°€μ‹œν‚¬ 수 μžˆλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

동적 κ³„νšλ²•μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλŠ” λŒ€ν‘œμ μΈ 예제인 <ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄>을 ν†΅ν•΄μ„œ 더 μžμ„Ένžˆ 이해해보도둝 ν•©μ‹œλ‹€!

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄λ‘œ 동적 κ³„νšλ²•μ„ μ΄ν•΄ν•΄λ³΄μž

 

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ΄λž€, μ–΄λ–€ μˆ˜μ—΄μ˜ 항이 μ•žμ˜ 두 ν•­μ˜ ν•©κ³Ό 같은 μˆ˜μ—΄μ„ λ§ν•©λ‹ˆλ‹€.

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ κ°„λ‹¨ν•˜κ²Œ ν™œμš©ν•œ 문제인 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ ν”Όλ³΄λ‚˜μΉ˜ 수 문제λ₯Ό 풀어보며 동적 κ³„νšλ²•μ„ 이해해보도둝 ν• κ²Œμš”! 

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

문제 μ„€λͺ…

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜λŠ” F(0) = 0, F(1) = 1일 λ•Œ, 1 μ΄μƒμ˜ n에 λŒ€ν•˜μ—¬ F(n) = F(n-1) + F(n-2) κ°€ μ μš©λ˜λŠ” 수 μž…λ‹ˆλ‹€. 

예λ₯Όλ“€μ–΄ 

  • F(2) = F(0) + F(1) = 0 + 1 = 1
  • F(3) = F(1) + F(2) = 1 + 1 = 2
  • F(4) = F(2) + F(3) = 1 + 2 = 3
  • F(5) = F(3) + F(4) = 2 + 3 = 5

와 같이 μ΄μ–΄μ§‘λ‹ˆλ‹€.

2 μ΄μƒμ˜ n이 μž…λ ₯λ˜μ—ˆμ„ λ•Œ, n번째 ν”Όλ³΄λ‚˜μΉ˜ 수λ₯Ό 1234567으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜, solution을 μ™„μ„±ν•΄ μ£Όμ„Έμš”.

μ œν•œ 사항

  • n은 2 이상 100,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆμ‹œ 및 μ„€λͺ…

  n   return
  3   2
  5   5

ν”Όλ³΄λ‚˜μΉ˜μˆ˜λŠ” 0λ²ˆμ§ΈλΆ€ν„° 0, 1, 1, 2, 3, 5, ... 와 같이 μ΄μ–΄μ§‘λ‹ˆλ‹€.

λ¬Έμ œν’€μ΄

1. μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ κ΅¬ν˜„

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Level2 λ‚œμ΄λ„μΈ 이 λ¬Έμ œλŠ” n번째 ν”Όλ³΄λ‚˜μΉ˜ 수λ₯Ό κ΅¬ν•˜λŠ”λ°, 이 수λ₯Ό 1234567으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λΌλŠ” 쑰건만 μΆ”κ°€λœ λ¬Έμ œμΈλ°μš”! λ¨Όμ €, μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ 문제λ₯Ό ν’€μ–΄λ³Έλ‹€λ©΄

 

func solution(_ n: Int) -> Int {
    if n <= 1 {
        return n
    } else {
        return (solution(n-1) + solution(n-2)) % 1234567
    }
}

 

μœ„μ™€ 같이 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

ν•˜μ§€λ§Œ.. λ¬Έμ œλŠ”..νš¨μœ¨μ„± μΈ‘λ©΄μ—μ„œ 쒋지 λͺ»ν•œ μ½”λ“œλΌλŠ” μ μž…λ‹ˆλ‹€!(μ‹œκ°„μ΄ˆκ³Όκ°€ 와λ₯΄λ₯΄πŸ₯²)

 

μ΄λ ‡κ²Œ μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ κ΅¬ν˜„ν•˜λŠ” 풀이가 μ™œ μ‹œκ°„μ΄ μ˜€λž˜κ±Έλ¦¬λŠ” ν’€μ΄μΌκΉŒμš”??πŸ€”

λ§Œμ•½ 4번째 ν”Όλ³΄λ‚˜μΉ˜ 수λ₯Ό 1234567으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ solution(4)λ₯Ό μ‹€ν–‰ν•˜λ©΄,

μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같은 ν˜•νƒœλ‘œ ν•¨μˆ˜κ°€ 호좜되게 λ©λ‹ˆλ‹€.

그림을 보면 λ™μΌν•œ ν•¨μˆ˜κ°€ 반볡적으둜 ν˜ΈμΆœλ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이미 ν•œ 번 κ³„μ‚°ν–ˆμ§€λ§Œ, 계속 호좜될 λ•Œ λ§ˆλ‹€ λ™μΌν•œ 값이 κ³„μ‚°λ˜κ²Œ λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μœ„μ˜ κ·Έλ¦Όμ—μ„œ soultion(1)은 총 3번 ν˜ΈμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€. solution(n)μ—μ„œ n값이 컀지면 컀질수둝 쀑볡 ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ™€ 쀑볡 횟수 λ˜ν•œ λŠ˜μ–΄λ‚˜κ²Œ λ˜λŠ”λ°, μ΄λŠ” n값이 컀짐에 따라 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 속도가 λ–¨μ–΄μ§„λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

2. 동적 κ³„νšλ²•μ„ μ΄μš©ν•œ κ΅¬ν˜„

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ˜ 점화식을 μœ„μ™€ 같이 μž¬κ·€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ λ§Œλ“€ μˆ˜λŠ” μžˆμ§€λ§Œ, λ‹¨μˆœνžˆ 맀번 κ³„μ‚°ν•˜λ„λ‘ ν•˜κΈ° λ•Œλ¬Έμ— 문제λ₯Ό 효율적으둜 ν•΄κ²°ν•  수 μ—†λ‹€λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” 동적 κ³„νšλ²•μ„ μ΄μš©ν•΄ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ©”λͺ¨μ΄μ œμ΄μ…˜ 기법을 ν™œμš©ν•΄ μ΄μ „에 κ³„μ‚°ν•œ 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•΄ 반볡 μˆ˜ν–‰μ„ μ œκ±°ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•΄λ΄…μ‹œλ‹€!

 

func solution(_ n: Int) -> Int {
    var cache = [0, 1]
    
    for i in 2...n {
        cache.append((cache[i-1] + cache[i-2]) % 1234567)
    }
    
    return cache[n]
}

 

μœ„μ™€ 같이 κ΅¬ν˜„ν•  수 μžˆλŠ”λ°μš”, μ½”λ“œλ₯Ό 보면 cacheλΌλŠ” Array μ €μž₯ 곡간을 ν™œμš©ν•΄ (이전 두 수의 ν•© % 1234567)인 값을 μ €μž₯해두고,

쀑볡 계산 없이 n번째 ν”Όλ³΄λ‚˜μΉ˜ 수λ₯Ό 1234567으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. (κ·Έλƒ₯ n번째 ν”Όλ³΄λ‚˜μΉ˜ 수λ₯Ό κ΅¬ν•˜κ³  μ‹Άλ‹€λ©΄ for λ£¨ν”„μ—μ„œ % 1234567 λΆ€λΆ„λ§Œ μ‚­μ œν•΄μ£Όλ©΄ 되겠죠?)

 

λ§Œμ•½ solution(4)λ₯Ό μ‹€ν–‰ν•œλ‹€λ©΄, (0, 1은 μ‹€ν–‰ μ‹œ μ΄ˆκΈ°κ°’μœΌλ‘œ cache에 μ €μž₯λ˜λ‹ˆ) 2, 3번째 κ°’κΉŒμ§€λ₯Ό λ¨Όμ € κ΅¬ν•˜μ—¬ μ €μž₯ν•˜κ³ , 이 값듀이 λͺ¨λ‘ μ €μž₯λ˜μ–΄μžˆλŠ” λ©”λͺ¨λ¦¬μ—μ„œ ν•„μš”ν•œ 값듀을 가져와 cache[2] + cache[3] 연산을 톡해 μ΅œμ’… 값을 λ„μΆœν•˜κ²Œ λ©λ‹ˆλ‹€. μ•žμ—μ„œ μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•œ 것과 달리 ν•¨μˆ˜μ˜ 쀑볡 싀행이 μ—†κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ 속도가 훨씬 λΉ¨λΌμ§€κ²Œ λ©λ‹ˆλ‹€. 

동적 κ³„νšλ²•μ˜ μ‚¬μš© 쑰건

예제λ₯Ό 톡해 μž¬κ·€ν•¨μˆ˜ 풀이와 λΉ„κ΅ν•΄λ³΄λ‹ˆ 이제 동적 κ³„νšλ²•μ΄ μ–΄λ–€ μ•Œκ³ λ¦¬μ¦˜ 기법인지 감이 μ˜€μ‹œμ£ ??

ν•˜μ§€λ§Œ λͺ¨λ“  문제λ₯Ό 동적 κ³„νšλ²•μ„ μ μš©ν•˜μ—¬ ν•΄κ²°ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€! 동적 κ³„νšλ²•μ€ λ‹€μŒ 두 가지 쑰건을 λ§Œμ‘±ν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

1. 큰 문제λ₯Ό μž‘μ€ 문제둜 λ‚˜λˆŒ 수 μžˆλ‹€.

2. μž‘μ€ λ¬Έμ œμ—μ„œ κ΅¬ν•œ 정닡은 그것을 ν¬ν•¨ν•˜λŠ” 큰 λ¬Έμ œμ—μ„œλ„ λ™μΌν•˜λ‹€.

동적 κ³„νšλ²•μ˜ 두 가지 방식

μœ„μ˜ <ν”Όλ³΄λ‚˜μΉ˜ 수> λ¬Έμ œμ—μ„œ μ μš©ν•œ 동적 κ³„νšλ²•μ˜ 풀이 방법은 λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•΄ μž‘μ€ λ¬Έμ œλΆ€ν„° 닡을 λ„μΆœν•΄ 이λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯해두고 이λ₯Ό μ΄μš©ν•΄ 큰 문제λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©μ‹μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•œ 방식은 μž‘μ€ λ¬Έμ œλΆ€ν„° μ°¨κ·Όμ°¨κ·Ό 닡을 λ„μΆœν•œλ‹€κ³  ν•˜μ—¬ 보텀업(Bottom-Up) 방식이라고 λ§ν•©λ‹ˆλ‹€.

 

동적 κ³„νšλ²•μ—λŠ” 보텀업 방식과 λ”λΆˆμ–΄ νƒ‘λ‹€μš΄(Top-Down) 방식도 μ‘΄μž¬ν•©λ‹ˆλ‹€.

νƒ‘λ‹€μš΄ 방식은 μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” λ°©μ‹μΈλ°μš”, 큰 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μž‘μ€ 문제λ₯Ό ν˜ΈμΆœν•œλ‹€κ³  ν•˜μ—¬ νƒ‘λ‹€μš΄ 방식이라고 λ§ν•©λ‹ˆλ‹€.

μœ„μ—μ„œ μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ λ°©μ‹μ˜ 쀑볡 μ‹€ν–‰μ΄λΌλŠ” 문제 λ•Œλ¬Έμ— 동적 κ³„νšλ²•μ„ μ‚¬μš©ν•΄ νš¨μœ¨μ„±μ„ κ°œμ„ ν–ˆλŠ”λ° 이게 무슨 μ†Œλ¦°κ°€...ν•˜μ‹€ 수 μžˆμ„ 것 κ°™μ€λ°μš”! νƒ‘λ‹€μš΄ λ°©μ‹μ˜ μ½”λ“œλ₯Ό ν•œ 번 μ‚΄νŽ΄λ΄…μ‹œλ‹€!

 

var cache = Array(repeating: 0, count: 100001)

func solution(_ n: Int) -> Int {
    
    // μ’…λ£Œ 쑰건(1 or 2일 λ•Œ 1을 λ°˜ν™˜)
    if n == 1 || n == 2 {
        return 1
    }
    
    // 이미 κ³„μ‚°ν•œ 적 μžˆλŠ” 문제라면 κ·ΈλŒ€λ‘œ λ°˜ν™˜
    if cache[n] != 0 {
        return cache[n]
    } else { // 아직 κ³„μ‚°ν•˜μ§€ μ•Šμ€ 문제일 λ•Œ 점화식에 따라 계산
        cache[n] = (solution(n-1) + solution(n-2)) % 1234567
    }
    
    return cache[n]
}

 

μ•žμ—μ„œ λ³Έ μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ 풀이와 λ‹€λ₯Έ 점은 μ œν•œ 사항에 μ œμ‹œλœ μ΅œλŒ“κ°’λ³΄λ‹€ 1만큼 큰 크기의 cacheλΌλŠ” 배열을 0으둜 μ΄ˆκΈ°ν™”ν•΄λ‘κ³  κ³„μ‚°ν•œ 값을 μ°¨λ‘€λ‘œ cache에닀 μ €μž₯ν•΄μ„œ λ‚˜μ€‘μ— λ™μΌν•œ 문제λ₯Ό 계산해야 ν•  λ•Œ, 이미 μ €μž₯ν•œ 값을 λ°˜ν™˜ν•˜μ—¬ ν•¨μˆ˜μ˜ 쀑볡 호좜이 없도둝 ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€! (μ‹€μ œλ‘œ 이 μ½”λ“œ λ˜ν•œ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ μ‹œκ°„ μ œν•œμ— 걸리지 μ•Šκ³  ν†΅κ³Όλ©λ‹ˆλ‹€)

 

μ΄λ ‡κ²Œ νƒ‘λ‹€μš΄ λ°©μ‹κΉŒμ§€ 동적 κ³„νšλ²•μ˜ 방식 두 가지 λͺ¨λ‘ μ‚΄νŽ΄λ³΄μ•˜λŠ”λ°μš”, 동적 κ³„νšλ²•μ˜ μ „ν˜•μ μΈ ν˜•νƒœλŠ” 보텀업 λ°©μ‹μž…λ‹ˆλ‹€. μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ κ΅¬ν˜„ν•  경우 값이 λ„ˆλ¬΄ μ»€μ„œ ν•¨μˆ˜ ν˜ΈμΆœμ„ μ•„μ£Ό 많이 ν•΄μ•Όν•  경우 μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  μˆ˜λ„ 있고, 미리 cache λ°°μ—΄μ˜ 크기λ₯Ό μ •ν•΄μ„œ μ΄ˆκΈ°ν™”ν•΄λ‘μ–΄μ•Ό ν•œλ‹€λŠ” 단점도 있기 λ•Œλ¬Έμ— κ°€λŠ₯ν•˜λ‹€λ©΄ 보텀업 방식을 ꢌμž₯ν•œλ‹€κ³  ν•©λ‹ˆλ‹€!

 

동적 κ³„νšλ²•μ€ 사싀 κ°œλ…μ€ 크게 어렡진 μ•Šμ§€λ§Œ μ μš©ν•˜κΈ°κ°€ 쉽지 μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€..(동적 κ³„νšλ²•μœΌλ‘œ ν’€ 수 μžˆκ² κ΅¬λ‚˜λ₯Ό κΉ¨λ‹«κ³  점화식을 μ„Έμš°λŠ” 과정이 μ–΄λ €μš΄ 것 κ°™μ•„μš”..) κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ§Œμ•½ νŠΉμ •ν•œ 문제λ₯Ό μ™„μ „ 탐색 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ ‘κ·Όν–ˆμ„ λ•Œ μ‹œκ°„μ΄ 맀우 μ˜€λž˜κ±Έλ¦°λ‹€λ©΄ 동적 κ³„νšλ²•μ„ μ μš©ν•  수 μžˆλŠ”μ§€ ν•΄κ²°ν•˜κ³ μž ν•˜λŠ” λΆ€λΆ„ λ¬Έμ œλ“€μ˜ 쀑볡 μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것도 쒋은 방법인 것 κ°™μŠ΅λ‹ˆλ‹€!

 


[참고 자료]

 

μ•Œκ³ λ¦¬μ¦˜κ³Ό 자료 ꡬ쑰 - λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° DP

μ€‘λ³΅λ˜λŠ” 연산을 μ€„μ΄λŠ” λ°©λ²•μ–Έμ œ μ‚¬μš©ν•˜λ‚˜?1\. 큰 문제λ₯Ό μž‘μ€ 문제둜 λ‚˜λˆŒ 수 있고(졜적 λΆ€λΆ„ ꡬ쑰)2\. μž‘μ€ λ¬Έμ œμ—μ„œ κ΅¬ν•œ 정닡은 그것을 ν¬ν•¨ν•˜λŠ” 큰 λ¬Έμ œμ—μ„œλ„ 동일할 λ•Œ(μ€‘λ³΅λ˜λŠ” λΆ€λΆ„ λ¬Έ

velog.io

 

Swift) 동적 κ³„νšλ²• (Dynamic Programming) μ΄ν•΄ν•˜κΈ°

μ•ˆλ…•ν•˜μ„Έμš”:) μ†Œλ“€μž…λ‹ˆλ‹€ μ˜€λžœλ§Œμ— ν¬μŠ€νŒ…μ„ ν•˜λŠ” 것 κ°™λ„€μš”..! μ•„λ§ˆ 1μ›” 달엔 자료ꡬ쑰 + μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•œ ν¬μŠ€νŒ…μ΄ 주일 것 κ°™κ³ .. 2월달뢀턴 λ‹€μ‹œ iOS + Swift에 λŒ€ν•œ ν¬μŠ€νŒ…μ„ ν•  μ˜ˆμ •μž…λ‹ˆλ‹€ :) 였

babbab2.tistory.com

<이것이 μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬>

 

이것이 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬 | λ‚˜λ™λΉˆ - ꡐ보문고

이것이 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬 | IT 취쀀생이라면 λˆ„κ΅¬λ‚˜ μž…μ‚¬ν•˜κ³  싢은 μΉ΄μΉ΄μ˜€γ†μ‚Όμ„±μ „μžγ†λ„€μ΄λ²„γ†λΌμΈ! μ·¨μ—…μ˜ 성곡 μ—΄μ‡ λŠ” μ•Œκ³ λ¦¬μ¦˜ 인터뷰에 μžˆλ‹€!IT 취쀀생이라면 λˆ„κ΅¬λ‚˜

product.kyobobook.co.kr