PS/문자열 알고리즘[String]

백준 1120 문자열(c++)

SeungbeomKim 2022. 7. 8. 17:49

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

<틀린 코드>

#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에 포함되어있지 않음