코딩 테스트(Coding Test)/알고리즘 개념

편집 거리 구하기 문제

배씌 2025. 4. 5. 18:01

편집 거리란?

두 문자열 A, B가 주어질 때, A를 B로 바꾸기 위해 필요한 최소 연산 횟수를 말한다. 대표적인 DP 문제이니 기억해두자.

 

편집에 사용할 수 있는 연산은 아래 3가지 이다.

  • 삽입
  • 삭제
  • 교체

여기서, 문자열 A의 길이를 m, B의 길이를 n 이라 할때, dp[i][j] 는 A의 앞 i개 문자와 B의 앞 j개 문자를 일치시키기 위한 최소 편집 거리를 의미한다.

 

예를 들어, A = "cat", B = "cut" 이라면, 초기 DP 테이블은 아래와 같이 구성할 수 있다.

  "" c u t
"" 0 1 2 3
c 1      
a 2      
t 3      

 

보통 편집 거리 문제는 작은 문자열에서부터 유도된다. -> 작은 문자열을 A(m), 큰 문자열을 B(n) 으로 잡고 계산하는걸 연습하자.


위 상황에서도 A(cat) 를 기준으로 dp[i][j] 를 탐색해보자.

 

위의 세 연산을 점화식으로 표현하면 아래와 같다.

  • 삽입 : dp[i][j] = dp[i][j-1] + 1
  • 삭제 : dp[i][j] = dp[i-1][j] + 1
  • 교체 : dp[i][j] = dp[i-1][j-1]

A를 기준으로 쉽게 말하면,

문자를 삽입 한다는 것은 오른쪽으로 한칸.

문자 삭제는 아래로 한칸.

문자 교체는 대각선 아래로 한칸 을 의미한다.

 

여기서 dp 테이블은 최소 편집 거리를 의미하므로, 그 전의 칸 값을 기준으로 최소값을 선택하여 +1을 해주면 최소 상태를 유지할 수 있다.

 

  "" c u t
"" 0 1 2 3
c 1 0 1 2
a 2 1 1 2
t 3 2 2 1

 


코드

import java.util.Scanner;

public class DP_36 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String A = sc.nextLine();
        String B = sc.nextLine();

        int n = A.length();
        int m = B.length();

        int[][] dp = new int[n+1][m+1];

        for(int i=0; i<=n; i++) {
            dp[i][0] = i;
        }
        for(int i=0; i<=m; i++) {
            dp[0][i] = i;
        }

        for(int i=1; i<=n; i++) {
            for(int j=1; j<=m; j++) {
                if(A.charAt(i-1) == B.charAt(j-1)) {
                    dp[i][j] = dp[i-1][j-1];
                } else {
                    dp[i][j] = 1 + Math.min(dp[i][j-1], Math.min(dp[i-1][j], dp[i-1][j-1]));
                }
            }
        }
        System.out.println(dp[n][m]);
    }
}