λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
CS/μ•Œκ³ λ¦¬μ¦˜

파이썬 ν–‰λ ¬ κ³±μ…ˆ, κ±°λ“­μ œκ³± κ΅¬ν•˜κΈ°

by πŸŒ»β™š 2021. 10. 21.

파이썬 ν–‰λ ¬

μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν’€ λ•Œ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 쀄이기 μœ„ν•΄ ν–‰λ ¬μ˜ κ±°λ“­μ œκ³±μ„ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ˜ κ°€μž₯ λΉ λ₯Έ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(LogN)이 ν–‰λ ¬λ‘œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”Όλ³΄λ‚˜μΉ˜μ™€ 행렬에 λŒ€ν•œ λ‚΄μš©μ€ μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜ 링크λ₯Ό μ°Έμ‘°ν•΄μ£Όμ„Έμš”.

[CS/μ•Œκ³ λ¦¬μ¦˜] - ν”Όλ³΄λ‚˜μΉ˜ 파이썬으둜 κ΅¬ν•˜λŠ” 3가지 μ•Œκ³ λ¦¬μ¦˜

 

ν”Όλ³΄λ‚˜μΉ˜ 파이썬으둜 κ΅¬ν•˜λŠ” 3가지 μ•Œκ³ λ¦¬μ¦˜

ν”Όλ³΄λ‚˜μΉ˜ 파이썬 3가지 μ•Œκ³ λ¦¬μ¦˜ ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ€ μ•„λž˜μ˜ μˆ˜μ‹μ€ λ§Œμ‘±ν•˜λŠ” μˆ˜μ—΄μž…λ‹ˆλ‹€. λ°”λ‘œ 이전 μˆ«μžμ™€ κ·Έ μ „ 숫자의 합을 μ—°μ†ν•΄μ„œ κ΅¬ν•˜λŠ” μˆ˜μ—΄μ΄κ³  μ•„λž˜μ™€ 같이 μ§„ν–‰λ©λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ”

myjamong.tistory.com

 

μ΄λ ‡κ²Œ 가끔씩 ν–‰λ ¬μ˜ κ³±μ…ˆμ„ μ‚¬μš©ν•˜λŠ”λ°... 이게 자주 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 3개의 μ€‘μ²©λœ for문을 μ‚¬μš©ν•˜λ‹€λ³΄λ‹ˆκΉŒ κ΅¬ν˜„ν•  λ•Œ μ €λŠ” 맀우 슀트레슀λ₯Ό λ°›μŠ΅λ‹ˆλ‹€...;; μ €λ§Œ 그런 것 μΌμˆ˜λ„ μžˆμ§€λ§Œ... 3쀑 쀑첩 forλ¬Έ λΆ€ν„°λŠ” λ―Έμ³λ²„λ¦½λ‹ˆλ‹€ γ…Žγ…Ž. κ·Έλž˜μ„œ μ •λ¦¬ν•˜λŠ” μ°¨μ›μ—μ„œ 파이썬으둜 ν–‰λ ¬μ˜ κ³±μ…ˆμ„ μ‰½κ²Œ μ΄ν•΄ν•˜κΈ° μœ„ν•œ 방법을 κ³΅μœ ν•˜κ³ μž ν•©λ‹ˆλ‹€.

 

 

ν–‰λ ¬ κ³±μ…ˆμ˜ νŠΉμ„±

λ‘κ°œμ˜ 행렬을 κ³±ν–ˆμ„ λ•Œ μ•žμ˜ ν–‰λ ¬ ν–‰, λ’€μ˜ ν–‰λ ¬ 열을 κΈ°μ€€μœΌλ‘œ μƒˆλ‘œμš΄ 행렬이 λ§Œλ“€μ–΄ μ§‘λ‹ˆλ‹€.

 

def matrix_mult(A, B):
    temp = [[0] * (len(A)) for _ in range(len(B[0]))]
    ...
    ...
    return temp

μœ„μ˜ νŠΉμ„±μ— 따라 μ½”λ“œμƒμ—μ„œ κ³±μ…ˆμ„ 톡해 λ°˜ν™˜λ  ν–‰λ ¬μ˜ ν¬κΈ°λŠ” μ•žμ˜ 행렬인 A의 ν–‰κ³Ό λ’€μ˜ 행렬인 B의 μ—΄λ‘œ μƒˆλ‘œμš΄ 크기의 행렬을 λ§Œλ“€μ–΄μ€€λ‹€.

 

 

ν–‰λ ¬μ˜ κ³±μ…ˆμ„ ν•˜λ‚˜μ”© λ‹€ 풀어보면 μœ„μ™€ 같이 ν’€ 수 μžˆλ‹€. 이거λ₯Ό λ³΄λ©΄μ„œ 숫자의 νŒ¨ν„΄μ„ 막 ν™•μΈν•˜κ³  ν•˜λ©΄ κ²°κ΅­μ—λŠ” κ²°κ³Όλ₯Ό 얻을 수 μžˆκΈ°λŠ” ν•œλ°... λˆˆμ— 잘 μ•ˆλ“€μ–΄ μ˜΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 이거λ₯Ό i, j, k 3개의 쀑첩 for문을 μ‚¬μš©ν•œλ‹€κ³  ν•  λ•Œ μ•„λž˜μ™€ 같은 νŒ¨ν„΄μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

i, j, k μˆœμ„œλŒ€λ‘œ 쀑첩이 λ“€μ–΄κ°€κ³  순회 방식을 보고 비ꡐ해보면 μ–΄λ–»κ²Œ κ³±μ…ˆμ΄ μ΄λ£¨μ–΄μ§€λŠ”μ§€ 확인할 수 μžˆλ‹€. κ·Έλƒ₯ λ¨Έλ¦¬μ†μœΌλ‘œ μƒκ°ν•˜λŠ” 것보닀 μ΄λ ‡κ²Œ 그림을 κ·Έλ €κ°€λ©΄μ„œ μ–΄λ–»κ²Œ λ‘œμ§μ„ λ§Œλ“€μ–΄μ•Όν• μ§€ 직접 눈으둜 보면 훨씬 더 μ‰½κ²Œ λ‹€κ°€κ°ˆ 수 μžˆλ‹€.

 

 

파이썬 ν–‰λ ¬ κ³±μ…‰ μ½”λ“œ

def matrix_mult(A, B):
    temp = [[0] * (len(A)) for _ in range(len(B[0]))]
    for i in range(len(A)):
        for j in range(len(A[0])):
            for k in range(len(B[0])):
                temp[i][k] += A[i][j] * B[j][k]
    return temp

i의 λ²”μœ„λ₯Ό A의 ν–‰, j의 λ²”μœ„λ₯Ό A의 μ—΄λ‘œ ν•˜κ±°λ‚˜ B의 ν–‰, kλŠ” B의 μ—΄λ‘œ μ§€μ •ν•œλ‹€. 그림의 λ‚΄μš©μ„ κ·ΈλŒ€λ‘œ μ½”λ“œλ‘œ λ°”κΎΈλ‹ˆ 훨씬 μ‰½κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

 

 

파이썬 ν–‰λ ¬ κ±°λ“­ 제곱

ν–‰λ ¬μ˜ κ³±μ…ˆλ§Œ μ΄μš©ν•˜λŠ” 것보닀 λŒ€λΆ€λΆ„ ν–‰λ ¬μ˜ κ±°λ“­μ œκ³±μ„ μ΄μš©ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•œλ‹€. κ·Έλž˜μ„œ 사싀 ν–‰κ³Ό μ—΄μ˜ 크기가 같은 정사각 행렬을 λŒ€λΆ€λΆ„ μ‚¬μš©ν•΄μ„œ i, j, k의 크기가 λͺ¨λ‘ κ°™κ²Œ ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€.

 

파이썬 ν–‰λ ¬ κ±°λ“­ 제곱 μ½”λ“œ

def matrix_mult(A, B):
    temp = [[0] * (len(A)) for _ in range(len(B[0]))]
    for i in range(len(A)):
        for j in range(len(A[0])):
            for k in range(len(B[0])):
                temp[i][k] += A[i][j] * B[j][k]
    return temp


def matrix_pow(A, n):
    if n == 1:
        return A
    if n % 2 == 0:
        temp = matrix_pow(A, n//2)
        return matrix_mult(temp, temp)
    else:
        temp = matrix_pow(A, n-1)
        return matrix_mult(temp, A)

ν–‰λ ¬μ˜ κ³±μ…ˆμ„ μ΄μš©ν•΄μ„œ κ±°λ“­μ œκ³±μ„ ꡬ할 수 μžˆλ‹€. μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μ œκ³±ν•˜λŠ” ν–‰λ ¬κΉŒμ§€ λ‚΄λ €μ˜€κ²Œν•˜κ³  μ œκ³±μˆ˜κ°€ 짝수인 경우 같은 행렬을 κ³±ν•΄ μ œκ³±μ‹œν‚€κ³  ν™€μˆ˜μΈ κ²½μš°λŠ” A ν–‰λ ¬ μžμ‹ μ„ κ³±ν•΄μ„œ ν•΄κ²°ν•œλ‹€.

λŒ“κΈ€