본문 바로가기

백준 문제 풀이

백준 15483번 최소 편집

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

 

15483번: 최소 편집

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

www.acmicpc.net

memo[a][b]를 A를 앞에서 a만큼 자르고 B를 앞에서 b만큼 자른 두 문자열을 같게 만드는데 필요한 최소 편집 횟수로 잡았다.

 

#include<iostream>
#include <string>
using namespace std;

int memo[1001][1001];

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	string A, B;
	cin >> A >> B;

	for (int i = 0; i <= A.size(); i++){
		for (int j = 0; j <= B.size(); j++){
			int a = 1000;
			if (!i && !j) a = 0;//두 문자열이 없으니 같다
			else if (!i || !j) a = i + j;//A 또는 B를 없어질때까지 문자 삭제
			if (i && j){
				if (memo[i - 1][j - 1] < a) a = memo[i - 1][j - 1];
				if (A[i - 1] != B[j - 1]) a++;//A의 i번째와 B의 j번째가 다르면 두 문자열중 하나의 마지막 문자를 다른 문자열의 마지막 문자로 변경
			}
            //두 문자열중 하나의 마지막 문자를 제거하거나 다른 문자열의 뒤에 삽입하는 경우
			if (i) if (memo[i - 1][j] + 1 < a) a = memo[i - 1][j] + 1;
			if (j) if (memo[i][j - 1] + 1 < a) a = memo[i][j - 1] + 1;
			memo[i][j] = a;
		}
	}

	cout << memo[A.size()][B.size()];

	return 0;
}

'백준 문제 풀이' 카테고리의 다른 글

백준 1967번 트리의 지름  (0) 2021.03.16
백준 9613번 GCD 합  (0) 2021.03.16
백준 13305번 주유소  (0) 2021.03.16
백준 2197번 분해 반응  (0) 2021.03.16
백준 10277번 JuQueen  (0) 2021.03.16