[백준 1120] 문자열 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
길이가 더 짧은 문자열 A를, 더 긴 문자열 B에 겹쳐 배치했을 때 두 문자열의 차이를 최소화하는 문제입니다.
여기서 문자열의 차이
는 같은 길이일 때 각 위치의 문자가 서로 다른 인덱스 개수를 의미합니다.
문자열 A의 앞이나 뒤에 임의의 문자를 추가하여 길이를 맞출 수 있으므로,
B의 연속된 부분 문자열 중 A와 길이가 같은 구간을 선택해 비교하면 됩니다.
접근법
B 문자열
내에서 길이가 **A문자열
과 같은 모든 연속된 부분 문자열**을 추출하여,
해당 문자열과 A문자열
을 문자
별로 비교합니다.
- 비교 시 두 문자열의 같은 위치에 있는 문자가 다르면 차이를
1씩
증가시킵니다. - 가능한 모든 배치에 대해 차이를 계산하고, 그 중 최솟값을 선택합니다.
과정은 다음과 같습니다:
- B의 길이에서 A의 길이를 뺀 만큼 구간을 설정
- 매 구간마다 A와 B의 해당 부분 문자열을 비교하며 차이를 계산
- 최소 차이를 갱신해나가며 전체 탐색이 끝난 뒤 정답을 출력
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
class Program {
static void Main() {
var tokens = Console.ReadLine().Split();
string a = tokens[0], b = tokens[1];
int minDiff = a.Length;
for (int i = 0; i <= b.Length - a.Length; i++) {
int diff = 0;
for (int j = 0; j < a.Length; j++) {
if (a[j] != b[i + j]) diff++;
}
minDiff = Math.Min(minDiff, diff);
}
Console.WriteLine(minDiff);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string a, b; cin >> a >> b;
int minDiff = a.size();
for (size_t i = 0; i <= b.size() - a.size(); ++i) {
int diff = 0;
for (size_t j = 0; j < a.size(); ++j)
diff += b[i + j] != a[j];
minDiff = min(minDiff, diff);
}
cout << minDiff << "\n";
return 0;
}