[이코테] 편집 거리

https://www.acmicpc.net/problem/15483

 

15483번: 최소 편집

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 소문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

www.acmicpc.net


문제 설명

두 개의 문자열 A와 B가 주어졌을 때, 문자열 A를 편집하여 문자열 B로 만들고자 합니다. 문자열 A를 편집할 때는 다음의 세 연산 중에서 한 번에 하나씩 선택하여 이용할 수 있습니다.

 

  1. 삽입(Insert): 특정한 위치에 하나의 문자를 삽입합니다.
  2. 삭제(Remove): 특정한 위치에 있는 하나의 문자를 삭제합니다.
  3. 교체(Replace): 특정한 위치에 있는 하나의 문자를 다른 문자로 교체합니다.

이때 편집 거리란 문자열 A를 편집하여 문자열 B로 만들기 위해 사용한 연산의 수를 의미합니다. 문자열 A를 문자열 B로 만드는 최소 편집 거리를 계산하는 프로그램을 작성하세요. 예를 들어 "sunday"와 "saturday"의 최소 편집 거리는 3입니다.


입력

두 문자열 A와 B가 한줄에 하나씩 주어집니다.

각 문자열은 영문 알파벳으로만 구성되어 있으며 , 각 문자열의 길이는 1보다 크거나 같고, 5,000보다 작거나 같습니다.


출력

최소 편집 거리를 출력합니다,


풀이

def edit_dist(str1,str2):
  n = len(str1)
  m = len(str2)

  # 다이나믹 프로그래밍을 위한 2차원 DP 테이블 초기화
  dp = [[0] *(m+1) for _ in range(n+1)]

  # DP테이블 초기 설정
  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]
      # 문자가 다르다면 3가지 경우 중에서 최솟값 찾기
      else: #삽입(왼쪽),삭제(위쪽),교체(왼쪽 위) 중에서 최소 비용을 찾아 대입
        dp[i][j] = 1 +min(dp[i][j-1],dp[i][j-1],dp[i-1][j-1])
  return dp[n][m]

str1 = input()
str2 = input()
print(edit_dist(str1,str2))
  

 

 

결과


문제 풀이

이 문제의 유형은 SSAFY를 준비할 때 풀었던 문제였다. 처음에는 어떻게 푸는지 아예 몰랐는데 코드에 대한 설명을 보니 문득 기억이 났다.

 

이러한 문제는 최소 편집거리를 담을 2차원 테이블을 초기화 한 뒤에, 최소 편집 거리를 계산해 테이블에 저장하는 과정으로 해결할 수 있다.  점화식은 다음과 같다.

두 문자가 같은 경우: dp[i][j] = dp [i-1][j-1]

두 문자가 다른 경우: dp[i][j] = 1+min(dp [i][j-1], dp [i][j-1], dp [i-1][j-1])

 

이를 말로 풀어서 설명하면

 

행과 열에 해당하는 문자가 서로 같다면 , 왼쪽 위에 해당하는 수를 그대로 대입

행과 열에 해당하는 문자가 서로 다르다면, 왼쪽(삽입), 위쪽(삭제),왼쪽 위(교체)에 해당하는 수 중에서 가장 작은 수에 1을 더해 대입

 

예를 들어 "sunday"를 "saturday"로 변경한다고 하면 이때 초기 2차원 테이블은 다음과 같이 구성된다.

 

  0 s a t u r d a y
0 0 1 2 3 4 5 6 7 8
s 1 0 1 2 3 4 5 6 7
u 2 1 1 2 2 3 4 5 6
n 3 2 2 2 3 3 4 5 6
d 4 3 3 3 3 4 3 4 5
a 5 4 3 4 4 4 4 3 4
y 6 5 4 4 5 5 5 4 3

 

2차원 테이블은 왼쪽(열)에 있는 문자열을 위쪽(행)에 있는 문자열로 바꾸는 비용을 직관적으로 보여준다. 예를 들어 dp [3][3]의 값은 2인데, 이는 'sun'이라는 문자열을 'sat'이라는 문자열로 바꾸기 위한 최소 편집 거리가 2라는 의미가 된다.

 

결과적으로 테이블의 가장 오른쪽 아래에 있는 값이 구하고자 하는 최소  편집 거리가 된다. 즉 아래 예시에서 최소 편집 거리는 3이다.

'Algorithm' 카테고리의 다른 글

[BOJ/백준] 11403번 경로 찾기  (0) 2021.03.02
[BOJ/백준] 11404번 플로이드  (0) 2021.03.02
[BOJ/백준] 18353번 병사 배치하기  (0) 2021.02.26
[BOJ/백준] 14501번 퇴사  (0) 2021.02.24
[BOJ/백준] 1932번 정수 삼각형  (0) 2021.02.24
<