https://www.acmicpc.net/problem/1120
1120번: 문자열
길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다. 두 문자열 A와 B가 주어진다. 이때, A의
www.acmicpc.net
💡 문자열
길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다.
두 문자열 A와 B가 주어진다. 이때, A의 길이는 B의 길이보다 작거나 같다. 이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다.
1. A의 앞에 아무 알파벳이나 추가한다.
2. A의 뒤에 아무 알파벳이나 추가한다.
이때, A와 B의 길이가 같으면서, A와 B의 차이를 최소로 하는 프로그램을 작성하시오.
[입력]
첫째 줄에 A와 B가 주어진다. A와 B의 길이는 최대 50이고, A의 길이는 B의 길이보다 작거나 같고, 알파벳 소문자로만 이루어져 있다.
[출력]
A와 B의 길이가 같으면서, A와 B의 차이를 최소가 되도록 했을 때, 그 차이를 출력하시오.
✅ 문제 풀이
문자열을 다루는 문제이다.
문제를 가만 보면, A의 앞에 문자를 추가하거나 뒤에 문자를 추가하거나에 초점을 맞출 시에는 복잡해진다.
어차피 채울 수 있는 문자열은 B와 동일한 문자열을 채우면 되기 때문에, 상관하지 않도록 한다.
A문자열 그 자체만을 보고, B문자열과 비교하는 것이다.
B문자열의 앞에서부터 A문자열 크키만큼 비교하는데, 그 차이가 가장 적을 때가 A와 B의 차이를 최소로 하는 것이다.
예를 들어서 B에 A문자열이 완전히 포함된다면 어떨까?
그럼 A문자열이 포함되는 부분을 제외하고만 A에 앞 뒤로 B와 동일하게 문자를 붙혀준다면, 두 문자열은 동일한게 되는 것이므로 차이는 0이 된다.
따라서 A가 B 중에서 가장 적게 차이나는 값을 구하면 된다.
그러기 위해 B에서 A를 뺀 값+1 만큼 for문을 돌면서 A와 B를 비교하는데, 이때 B를 그냥 비교하는게 아니라, A의 길이만큼 일정부분 잘라서 비교하도록 하였다. 이때는 string의 substr함수를 사용하였다.

이런식으로 A를 B의 앞 부터 밀어가면서 비교해보는 것이다.
☑ 코드 전문
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string a, b;
cin >> a >> b;
int cnt = 50;
for (int i = 0; i < b.length() - a.length() + 1; i++) {
string str = b.substr(i, a.length());
int now = 0;
for (int j = 0; j < a.length(); j++) {
if (a[j] != str[j]) now++;
}
cnt = min(cnt, now);
}
cout << cnt;
}
'CO-TE > 백준' 카테고리의 다른 글
[백준] 2003번 C++ "수들의 합2" 풀이 / 누적합, 두 포인터 (1) | 2023.11.28 |
---|---|
[백준] 1068번 C++ "트리" 풀이 / 그래프 탐색, DFS 알고리즘 (1) | 2023.11.26 |
[백준] 1012번 C++ "유기농 배추" 풀이 / DFS 알고리즘 (2) | 2023.11.23 |
[백준] 1005번 C++ "ACM Craft" 풀이 / 위상정렬, 큐, 그래프 알고리즘 (2) | 2023.11.22 |
[백준] 1026번 C++ "보물" 풀이 / 그리디 알고리즘 (1) | 2023.11.21 |