문제풀이(Problem Solving)

백준, BOJ, 1543번, 문서 검색 : C++ [CPP]

게임이 더 좋아 2021. 12. 5. 19:16
반응형
728x170

 

어렵지 않았다

다만 첫번째로 못풀었다.

왜 그런지 고찰해보자

 

 

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

 


 

#맞은 풀이

#include <iostream>
#include <string>

using namespace std;


int main() {

    string s;
    string target;

    getline(cin, s);
    getline(cin, target);

    int size = target.size();
    int cnt = 0;

    while (1) {
        int idx = s.find(target);
        //찾았으면 해당 문자열에서 삭제
        if (idx != string::npos) {
            auto it = s.begin() + idx;
            //s.erase(it, it+size); -> 삭제
            s = s.substr(idx + size);
            cnt++;
            continue;
            //나머지 문자열에서 다시 조사
        }
        else {
            break;
        }
    }



    cout << cnt;
    return 0;
}

 

 

여기서 erase로 푼 것은 틀리고

substr으로 푼 것은 맞았다..

무슨 차이일까?

 

s의 변화를 보자

우선 맞는 정답인 substr부터 보자

위 2개의 입력에 대해 아래처럼 서브스트링이 나왔다.

 

erase를 보자

 

?? 뭔가 덜 지워졌다

즉, 앞에 것은 읽을 필요가 없음에도

앞에 것은 단어에 속하지 않아서 남아버린 것이다.

 

erase로는 특정 단어만 지우는 것이지 특정단어가 출현한 이후의 문자열만 남기는 것은 아니었다.

 

 

substr -> 특정 문자 출현 이후의 문자열만 담음

erase -> 특정 문자만 없앤 문자열을 담음

 

시도는 좋았으나 substr, erase를 잘 사용할 수 있도록 연습해보자

 

728x90
반응형
그리드형