[자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜] 곡간 λ³΅μž‘λ„μ™€ μž¬κ·€ν•¨μˆ˜λž€?

2021. 9. 8. 08:00ㆍ코딩 ν…ŒμŠ€νŠΈ μ€€λΉ„

728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘ μž…λ‹ˆλ‹€.

μ˜€λŠ˜μ€ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ˜ 곡간 λ³΅μž‘λ„μ— λŒ€ν•΄ 곡뢀 ν•΄ 보도둝 ν•˜λŠ” κ²ƒμ΄μ—μš”.

μ†ŒμŠ€ μ½”λ“œμ— λŒ€ν•΄μ„œ 확인 ν•˜κ³  μ‹ΆμœΌμ‹  λΆ„λ“€κ»˜μ„œλŠ” μ£Όλ‹ˆν•˜λž‘μ˜ Git hub에 관심을 μ£Όμ„Έμš”!



 

 


 

 

 

πŸ“Œ 곡간 λ³΅μž‘λ„ (Space Comploexity)


μ•Œκ³ λ¦¬μ¦˜μ—μ„œ 계산 λ³΅μž‘λ„λ₯Ό 계산할 λ•Œ 두 가지λ₯Ό κ³ λ €ν•˜λŠ” κ²ƒμ΄μ—μš”.

  1. μ‹œκ°„ λ³΅μž‘λ„: μ–Όλ§ˆλ‚˜ λΉ λ₯΄κ²Œ μ‹€ν–‰λ˜λŠ”κ°€?
  2. 곡간 λ³΅μž‘λ„: μ–Όλ§ˆλ‚˜ 적은 μ €μž₯ 곡간 μš©λŸ‰μ„ μ‚¬μš©ν•˜λŠ”κ°€?

 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 쒋은 μ•Œκ³ λ¦¬μ¦˜μ΄λž€? μ‹€ν–‰ μ‹œκ°„λ„ 짧고, μ €μž₯ 곡간도 적게 μ‚¬μš©ν•˜λŠ” κ²ƒμ΄κ² μ§€μš”?

 

ν•˜μ§€λ§Œ, λ‘˜ λ‹€ 만쑱 μ‹œν‚€κΈ΄ μ–΄λ €μš΄ κ²ƒμ΄μ—μš”.

μ™œλƒν•˜λ©΄? μ‹œκ°„κ³Ό 곡간은 μ™„μ „ν•˜μ§€λŠ” μ•Šμ§€λ§Œ, 반 비둀적 μ„±ν–₯을 가지고 있기 λ•Œλ¬Έμ΄λžλ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ΅œκ·Όμ—λŠ” λŒ€μš©λŸ‰ System이 λ³΄νŽΈν™”λ˜λ©΄μ„œ 곡간 λ³΅μž‘λ„ λ³΄λ‹€λŠ” μ‹œκ°„ λ³΅μž‘λ„λ₯Ό μš°μ„ ν•˜λŠ” κ²½ν–₯이 μžˆλŠ” κ²ƒμ΄μ—μš”.

λ‹€λ§Œ, Big Data와 같이 κ³ μš©λŸ‰μ„ λ‹€λ£¨λŠ” μ—…κ³„μ—μ„œλŠ” λ‹Ήμ—°νžˆ 곡간 λ³΅μž‘λ„λ„ κ³ λ € ν•œλ‹€λŠ” 것 μžŠμ§€ λ§ˆμ„Έμš”!

κ²°κ΅­ μ•Œκ³ λ¦¬μ¦˜μ€ μ‹œκ°„ λ³΅μž‘λ„κ°€ μ€‘μš”ν•˜λ‹€κ³  정리할 수 μžˆκ² λ„€μš”!

 

    πŸ“ 곡간 λ³΅μž‘λ„λŠ” λŒ€λž΅μ μΈ 계산이 ν•„μš”ν•˜λ‹΅λ‹ˆλ‹€.

μ˜ˆμ „μ— λ§Œλ“€μ–΄μ‘Œλ˜ 곡간 λ³΅μž‘λ„μ— κ΄€ν•œ κ³ λ € 사항 λ¬Έμ œλ“€μ΄ κΈ°μ‘΄ μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμ— 많이 λ…Ήμ•„ μžˆλŠ” κ²ƒμ΄μ—μš”.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— κΈ°μ‘΄ μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμ— μ‹œκ°„ λ³΅μž‘λ„ 뿐만 μ•„λ‹ˆλΌ, 곡간 λ³΅μž‘λ„ μ œμ•½ 사항이 문제둜 λ‚˜μ˜€λŠ” κ²½μš°κ°€ λ§Žλ‹€κ³  ν•©λ‹ˆλ‹€.

λ˜ν•œ, κΈ°μ‘΄ μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμ— 영ν–₯을 λ°›μœΌμ‹  μ˜ˆμ „μ— μ·¨μ—…ν•œ μ„ λ°° 개발자 뢄듀이 λ©΄μ ‘μ—μ„œ 곡간 λ³΅μž‘λ„μ— λŒ€ν•΄ λ¬»λŠ” κ²½μš°λ„ κ½€ μžˆλ‹€κ³  ν•΄μš”!

 

 

    πŸ“ μžμ„Ένžˆ μ•Œμ•„λ³΄κΈ°

Program을 μ‹€ν–‰ 및 μ™„λ£Œν•˜λŠ”λ°, ν•„μš”ν•œ μ €μž₯κ³΅κ°„μ˜ 양을 λ°”λ‘œ 곡간 λ³΅μž‘λ„λ‘œ κ³„μ‚°ν•˜λŠ” κ²ƒμ΄μ—μš”.

총 ν•„μš” μ €μž₯ 곡간은 μ–΄λ–»κ²Œ κ³„μ‚°ν• κΉŒμš”?

  1. κ³ μ • 곡간 (μ•Œκ³ λ¦¬μ¦˜κ³Ό λ¬΄κ΄€ν•œ 곡간) : Code μ €μž₯ 곡간, λ‹¨μˆœ λ³€μˆ˜ 및 μƒμˆ˜κ°€ μ‚¬μš©
  2. κ°€λ³€ 곡간 (μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰κ³Ό κ΄€λ ¨ν•œ 곡간) : μ‹€ν–‰ 쀑 λ™μ μœΌλ‘œ ν•„μš”ν•œ 곡간
  3. $ S(P) = c + S_p(n) $
    • μ—¬κΈ°μ„œ c = κ³ μ • 곡간
    • μ—¬κΈ°μ„œ $ S_p(n) $ = κ°€λ³€ 곡간을 λ‚˜νƒ€λƒ„

 

 

 

    πŸ“ 곡간 λ³΅μž‘λ„ 계산법은 λ¬΄μ—‡μΌκΉŒμš”?

곡간 λ³΅μž‘λ„ 계산은 μ•Œκ³ λ¦¬μ¦˜μ—μ„œ μ‹€μ œ μ‚¬μš©λ˜λŠ” μ €μž₯ 곡간을 κ³„μ‚°ν•˜λ©΄ λ˜λŠ” κ²ƒμ΄μ—μš”.

이λ₯Ό Big O ν‘œκΈ°λ²•μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€λ©΄ λœλ‹΅λ‹ˆλ‹€!

 

 

          πŸ‘‰ 곡간 λ³΅μž‘λ„ 예제 1

n! (Factorial) κ΅¬ν•˜κΈ°

곡식 : n! = 1 x 2 x 3 x ... x n

n의 값에 상관없이 λ³€μˆ˜ n, λ³€μˆ˜ fac, λ³€μˆ˜ index와 같이 μ„Έ 개의 λ³€μˆ˜λ§Œ ν•„μš”ν•œ κ²ƒμ΄μ—μš”.

κ²°κ΅­ λ³€μˆ˜κ°€ 각각 ν•˜λ‚˜μ”© ν•„μš”ν•œ κ²ƒμ΄λ‹ŒκΉŒ 곡간 λ³΅μž‘λ„λŠ” O(1)이 λ˜λŠ”λ°, μ΄λŠ” μ‹€μ œ μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰ μ‹œ μ‚¬μš©λ˜λŠ” μ €μž₯ 곡간을 κ³„μ‚°ν•˜λ©΄ λ˜λŠ” κ²ƒμ΄μ—μš”.

 

def factorial(data):
    fac_num = 1
    round_num = 0

    start_factorial_time = time.time()

    for index in range(2, data + 1):
        fac_num = fac_num * index
        round_num += 1
        print(str(round_num) + "번째 factorial 값은 \"" + str(fac_num) + "\" μž…λ‹ˆλ‹€.")

    print("Factorial 계산 κ°„ κ±Έλ¦° μ‹œκ°„μ€ " + str(time.time() - start_factorial_time) + "초 μž…λ‹ˆλ‹€.")
    print("\n")
    return fac_num
    
    
    
print(factorial(3))

# κ²°κ³Ό 6

 

 

          πŸ‘‰ 곡간 λ³΅μž‘λ„ 예제 2

 

n! (Factorial) κ΅¬ν•˜κΈ°

곡식 : n! = 1 x 2 x 3 x ... x n

μ΄λ²ˆμ—λŠ” μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ λ³Ό κ²ƒμ΄μ—μš”. n에 따라, λ³€μˆ˜ n이 nκ°œκ°€ λ§Œλ“€μ–΄μ§€λŠ” κ²ƒμ΄μ—μš”.

Factorial Function을 μž¬κ·€ ν•¨μˆ˜λ‘œ 1κΉŒμ§€ ν˜ΈμΆœν•˜μ˜€μ„ λ•Œ, n λΆ€ν„° 1κΉŒμ§€ Stack에 μŒ“μ΄κ²Œ λœλ‹΅λ‹ˆλ‹€.

κ²°κ΅­ 곡간 λ³΅μž‘λ„λŠ” O(n)이 λ˜κ² λ„€μš”!

 

def factorial_recursion(data):

    if data > 1:
        a = data * factorial_recursion(data - 1)

        return a

    else:
        return 1

 

Complexity:

expected worst-case time complexity : O(N)
expected worst-case space complexity: O(N)

 

 

 

 

πŸ“Œ μž¬κ·€ μš©λ²•(Recursive call, μž¬κ·€ 호좜)


κ³ κΈ‰ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ—μ„œλŠ” μž¬κ·€ μš©λ²•μ„ 많이 μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ—μš”.

κ·Έλž˜μ„œ κ³ λ¦… μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ„ κ³΅λΆ€ν•˜κΈ° 전에 μ£Όλ‹ˆν•˜λž‘μ€ μž¬κ·€ μš©λ²•μ„ κ³΅λΆ€ν•˜κΈ°λ‘œ ν•©λ‹ˆλ‹€!

 

μž¬κ·€ μš©λ²•μ€ ν•¨μˆ˜ μ•ˆμ—μ„œ λ™μΌν•œ ν•¨μˆ˜(자기 μžμ‹ )을 ν˜ΈμΆœν•˜λŠ” ν˜•νƒœμΈ κ²ƒμ΄μ—μš”.

μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜ μž‘μ„± μ‹œμ— μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ΅μˆ™ν•΄μ Έμ•Ό ν•œλ‹€κ³  ν•©λ‹ˆλ‹€!

 

 

    πŸ“ 예제

  • Factorial을 κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ Recursive Call을 μ΄μš©ν•˜μ—¬ ν’€μ–΄λ³΄μž!

 

 

 

          πŸ‘‰ 예제 뢄석

  1. κ°„λ‹¨ν•œ 것뢀터 μƒκ°ν•˜κΈ°
    • 2! = 1 X 2
    • 3! = 1 X 2 X 3
    • 4! = 1 X 2 X 3 X 4
  2. λ°˜λ³΅λ˜λŠ” κ·œμΉ™ 생각 ν•΄ 보기 :
    • n! = n X (n -1)!
      예λ₯Ό λ“€μ–΄ 4라면 4 = 4 X 3! 즉, 자기 μžμ‹ μ—μ„œ 1 λΊ€ 값듀을 κ³±ν•˜λŠ” κ·œμΉ™μ΄ 보인닀.
    • ν•¨μˆ˜ λ§Œλ“€κΈ°
    • ν•¨μˆ˜(n)은 n > 1 이면 return n X ν•¨μˆ˜(n -1)
    • ν•¨μˆ˜(n)은 n = 1 이면 return n
  3. 검증 (μ½”λ“œλ‘œ λΆ€ν„° κ²€μ¦ν•˜μ§€ μ•Šκ³ , 직접 κ°„λ‹¨ν•œ κ²½μš°λΆ€ν„° λŒ€μž…ν•΄μ„œ 검증해야 ν•˜λŠ” 것!)
    • 2! κ²€μ¦ν•˜κΈ°!
      • ν•¨μˆ˜(2) 이면, 2 > 1이기 λ•Œλ¬Έμ— 2 X ν•¨μˆ˜(1)
      • ν•¨μˆ˜(1)은 1κ³Ό κ°™κΈ° λ•Œλ¬Έμ— 쑰건문에 λ§žμ§€ μ•ŠλŠ”λ‹€ κ²°κ΅­ return n이 λ˜λ©΄μ„œ λ°˜ν™˜μ΄ μ΄λ€„μ§ˆ 것이고, 이럴 경우 return 2 X 1 = 2κ°€ λœλ‹€.
    • 3! κ²€μ¦ν•˜κΈ°!
      • ν•¨μˆ˜(3) 이면, 3 > 1이기 λ•Œλ¬Έμ— 3 X ν•¨μˆ˜(2)
      • ν•¨μˆ˜(2)λŠ” κ²°κ΅­ 1λ²ˆμ— μ˜ν•΄ 2! μ΄λ―€λ‘œ, return 2 X 1 =2
      • 3 X ν•¨μˆ˜(2) = 3 X 2 = 3 X 2 X 1 = 6이 λœλ‹€.
    • 4! κ²€μ¦ν•˜κΈ°!
      • ν•¨μˆ˜(4)이면, 4 > 1이기 λ•Œλ¬Έμ— 4 X ν•¨μˆ˜(3)
      • ν•¨μˆ˜(3)은 2λ²ˆμ— μ˜ν•΄ 3 X 2 X 1 = 6이 λœλ‹€.
      • 4 X ν•¨μˆ˜(3) = 4 X 6 = 24κ°€ λœλ‹€.

 

 

          πŸ‘‰ Python

def factorial(n):
    if n > 1:
        return n * factorial(n - 1)

    else:
        return n
        
for num in range(10):
    print(factorial(num))
    
# κ²°κ³Ό : 0
#		1
#		2
#		6
#		24
#		120
#		720
#		5040
#		40320
#		362880

 

 

          πŸ‘‰ μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„

factorial(n)은 n - 1번의 factorial()을 ν˜ΈμΆœν•˜μ—¬ 곱셉을 ν•˜λŠ” κ²ƒμ΄μ—μš”.

μΌμ’…μ˜ n - 1번 λ°˜λ³΅λ¬Έμ„ λŒλ¦¬λŠ” 것과 κ°™λ‹€κ³  λ³Ό 수 μžˆκ² λ„€μš”!!

factorial() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€, μ§€μ—­λ³€μˆ˜ n이 μƒκΈ°λŠ” κ²ƒμ΄μ—μš”.

κ²°κ΅­ μ‹œκ°„ λ³΅μž‘λ„ / 곡간 λ³΅μž‘λ„λŠ” O(n - 1)이 λ˜λŠ”λ°, Big O ν‘œκΈ°λ²•μ—μ„œλŠ” 뒀에 뢀뢄을 μž˜λΌλ²„λ¦¬κ²Œ λ•Œλ¬Έμ— O(n)이 λ˜λŠ” κ²ƒμ΄λžλ‹ˆλ‹€!

 

 

 

    πŸ“ μž¬κ·€ 호좜의 일반적인 ν˜•νƒœ

# 일반적인 ν˜•νƒœ1
def function(μž…λ ₯):
    if μž…λ ₯ > 일정값: # μž…λ ₯이 일정 κ°’ 이상이면
        return function(μž…λ ₯ - 1) # μž…λ ₯보닀 μž‘μ€ κ°’
    else:
        return 일정값, μž…λ ₯κ°’, λ˜λŠ” νŠΉμ •κ°’ # μž¬κ·€ 호좜 μ’…λ£Œ

 

# 일반적인 ν˜•νƒœ2
def function(μž…λ ₯):
    if μž…λ ₯ <= 일정값:              		 # μž…λ ₯이 일정 값보닀 μž‘μœΌλ©΄
        return 일정값, μž…λ ₯κ°’, λ˜λŠ” νŠΉμ •κ°’   # μž¬κ·€ 호좜 μ’…λ£Œ
    function(μž…λ ₯보닀 μž‘μ€ κ°’)
    return κ²°κ³Όκ°’

 

def factorial_reverse(n):
    if n <= 1:
        return n

    else:
        return n * factorial_reverse(n - 1)
        
        
for num in range(10):
    print(factorial_reverse(num))
    
    
    
# κ²°κ³Ό : 0
#		1
#		2
#		6
#		24
#		120
#		720
#		5040
#		40320
#		362880

 

 

 

          πŸ‘‰ μž¬κ·€ ν˜ΈμΆœκ΄€λ ¨ Stack

ν•¨μˆ˜λŠ” λ‚΄λΆ€μ μœΌλ‘œ Stack처럼 관리 λ©λ‹ˆλ‹€!

 

 

μž¬κ·€ ν˜ΈμΆœμ— λŒ€ν•΄ 잘 이해가 λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 이 곳을 μ°Έκ³  ν•΄ λ³΄λŠ”κ±Έ μΆ”μ²œ λ“œλ¦¬λŠ” κ²ƒμ΄μ—μš”!

참고둜 νŒŒμ΄μ¬μ€ λ‚΄λΆ€μ μœΌλ‘œ Stack을 1000회 κΉŒμ§€ Limit을 κ±Έμ–΄ 놓은 κ²ƒμ΄μ—μš”. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ°°κ·€ ν•¨μˆ˜ 깊이(ν•œλ²ˆμ— ν˜ΈμΆœλ˜λŠ” 횟수)κ°€ 1000회 μ΄ν•˜μ—¬μ•Ό ν•˜κ³ , 이 이상을 λ„˜μœΌλ©΄ Errorκ°€ λ‚œλ‹€κ³  ν•©λ‹ˆλ‹€!

 

 


 

 

μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€μ€ μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€

 

728x90
λ°˜μ‘ν˜•