https://www.acmicpc.net/problem/1120
<틀린 코드>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string a,b;
cin>>a>>b;
int cnt=0;
if(a.size()==b.size())
{
for(int i=0;i<a.size();i++)
{
if(a[i]!=b[i]) cnt++;
}
cout<<cnt<<'\n';
}
else
{
if(b.find(a) != string::npos)
{
cout<<0<<'\n';
return 0;
}
int cnt1=0;
int cnt2=0;
string s3="";
string s4="";
for(int i=0;i<b.size()-a.size();i++)
{
s3+=b[i];
}
s3+=a;
s4+=a;
for(int j=a.size();j<b.size();j++)
{
s4+=b[j];
}
for(int i=0;i<s3.size();i++)
{
if(s3[i]!=b[i]) cnt1++;
if(s4[i]!=b[i]) cnt2++;
}
int result = min(cnt1,cnt2);
cout<<result<<'\n';
}
}
<맞는 코드>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
int cnt;
int ans = 50;
string a,b;
cin >> a >> b;
for(int j=0; j<=b.length() - a.length(); j++){
cnt = 0;
for(int i = 0; i < a.length(); i++){
if(a[i] != b[i+j]) cnt++;
}
ans = min(ans,cnt);
}
cout<<ans<<endl;
}
<풀이과정>
새로운 빈 문자열 두 개를 만들어, 길이가 짧은 문자열 a + b의 뒤의 원소
b의 앞의 원소 + 길이가 짧은 문자열 a
를 각각 만들어서 b의 문자열과 새롭게 만든 문자열의 길이를 맞춰준다. b 문자열의 각각의 원소와 비교해서 각각의 차이를 비교해 더 적은 것을 출력하게 했다.
그런데 예시 테스트와 게시판 테스트도 통과 했는데 틀렸다고 뜬다.(아직도 모르겠다..)
그래서 새롭게 생각한 아이디어가 문자열 b에 a가 포함되는지 안되는지의 여부를 찾는 것이였다. (왜냐하면 a의 문자열 앞뒤로 문자를 추가할 수 있기 때문에 a랑 b랑 다른 부분만 찾으면 되기 때문이다.)
<참고>
문자열 포함 여부를 찾는 함수 find
b.find(a)!=string::npos => a가 b에 포함되어있음
b.find(a)==string::npos=>a가 b에 포함되어있지 않음
'PS > 문자열 알고리즘[String]' 카테고리의 다른 글
백준 15353 큰 수 A+B(c++) (0) | 2022.07.12 |
---|---|
백준 11478 서로 다른 부분 문자열의 개수(c++) (1) | 2022.07.11 |
백준 1431 시리얼 번호(c++) (1) | 2022.07.08 |
백준 11656 접미사 배열(c++) (1) | 2022.07.08 |
백준 1212 8진수 2진수(c++) (0) | 2022.07.06 |