개념
편집거리 알고리즘이란 두 문자열이 주어졌을 때 문자열을 비교하는 알고리즘입니다. 여기서 비교한다는 것은 삽입, 삭제, 교체 즉 3가지의 액션이 주어졌을 때 두 문자열이 같게 하기 위해 취할 수 있는 액션의 최솟값을 구하는 알고리즘이라는 것입니다. 예를 들어서 str1 = python, str2 = pyytthon 라 가정하고 문제를 해결해보겠습니다. 이 알고리즘은 다이내믹 프로그래밍 즉 dp의 일종이기 때문에 dp 테이블의 형태로 이차원 리스트를 구현하면 쉽게 해결할 수 있습니다.
다음의 표를 봅시다.
None | p | y | y | t | h | o | n | |
None | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
p | 1 | 0 | 1 | |||||
y | 2 | |||||||
t | 3 | |||||||
h | 4 | |||||||
o | 5 | |||||||
n | 6 |
먼저 str1을 행으로 str2를 열로 넣고 각 행과 열에 숫자를 넣은 상태입니다. 여기서 만약 p, p를 비교하는 경우 즉 2행 2열의 경우는 두 문자가 같기 때문에 좌측 위의 0이 그대로 2행 2열에 대입됩니다.
그러나 p, y와 같은 두 문자열이 다른 경우 즉 2행 3열의 경우 좌측, 좌측 위, 위 의 3가지 경우 중 최솟값에 1을 더한 값이 대입됩니다. 여기서는 최솟값이 2행 2열 즉 0 이기 때문에 0에 1을 더한 1이 대입됩니다. 그 과정을 전부 다 하면 다음과 같습니다.
None | p | y | y | t | h | o | n | |
None | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
p | 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
y | 2 | 1 | 0 | 1 | 2 | 3 | 4 | 5 |
t | 3 | 2 | 1 | 1 | 1 | 2 | 3 | 4 |
h | 4 | 3 | 2 | 2 | 2 | 1 | 2 | 3 |
o | 5 | 4 | 3 | 3 | 3 | 2 | 1 | 2 |
n | 6 | 5 | 4 | 4 | 4 | 3 | 2 | 1 |
이 표의 최우 측 하단의 값이 두 문자열을 비교한 후 서로 같게 하는 최소의 액션의 수입니다. python에 y뒤에 혹은 y앞에 y를 삽입하는 1번의 과정으로 pyyhton을 만들 수 있기 때문입니다.
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
str1 = "sunday"
str2 = "saturday"
n = len(str1)
m = len(str2)
dp = [[0] * (1+m) for _ in range(1+n)]
for i in range(1, n+1):
dp[i][0] = i
for j in range(1, m+1):
dp[0][j] = j
for i in range(1, n+1):
for j in range(1, m+1):
if str1[i-1] == str2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = min(dp[i][j-1], dp[i-1][j-1], dp[i-1][j]) + 1
print(dp[n][m])
|
cs |
'알고리즘 > 알고리즘 이론' 카테고리의 다른 글
서로소 집합 알고리즘 (Python) (0) | 2020.12.30 |
---|---|
다익스트라 알고리즘 (Python) (0) | 2020.12.22 |
에라토스테네스의 체를 이용한 소수 판별 (Python) (0) | 2020.12.21 |
가장 긴 증가하는 부분 수열 - Longest Increasing Subsequence (Python) (0) | 2020.12.19 |
이진탐색 (Python) (0) | 2020.12.16 |