백준

백준 2941 c++ 풀이

ris 2024. 7. 9. 20:13

 

이번 문제는 입력받은 문자열 속 특정 문자열을 감지해내는 문제였다.

방법은 여러가지겠지만 생각나는 방법은 두 가지 정도였다.

 

하나는 if문을 사용하는 방법

다른 하나는 string 라이브러리의 find를 사용하는 방법이다.

 

그래서 둘 다 했다.

 

string 라이브러리의 find를 사용한 풀이


#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
    size_t pos;
    vector<string> alpha = {"c=", "c-","dz=","d-","lj","nj" ,"s=" , "z="}; // 확인용 vector로 하면 python의 list 처럼 할 수 있음.
    string str;
    cin >> str;
    for(int i = 0; i < alpha.size(); i++){ // 위 하나씩 계산
        while(1){ // 두 개 이상일 시에 재검
            pos = str.find(alpha[i]); // 하나씩 계산
            if(pos == string::npos) break;
            str.replace(pos, alpha[i].length(), "#"); // 처리
        }
    }
    cout << str.length();
    
    return 0;
}

이해를 돕기 위해 주석을 달았다.

허나 부족할 수 있기에 설명을 하겠다.

내가 사용한 방법은 find를 사용해 특정 문자열을 감지 및 index값을 받아내고 본 문자열을 # (다른 것도 됨) 으로 바꿔 출력할 때 길이를 측정한 값을 넣는 방법을 사용했다.

복잡해보이지만 그냥 find와 replace를 적당히 쓰면 됐다.

 

if 문을 사용한 풀이


#include<iostream>
using namespace std;
int main(){
    string str;
    cin >> str;
    size_t i = 0;
    int cnt = 0;
    while(i < str.length()){
        if(str[i] == 'c'){
            if(str[i+1] == '=' || str[i+1] == '-'){
                i++;
            }
        }
        if(str[i] == 'd'){
            if(str[i+1] == 'z' && str[i+2] == '='){
                i += 2;
            }
            if(str[i+1] == '-'){
                i++;
            }
        }
        if(str[i] == 'l' && str[i+1] == 'j'){
            i++;
        }
        if(str[i] == 's' && str[i+1] == '='){
            i++;
        }
        if(str[i] == 'z' && str[i+1] == '='){
            i++;
        }
        if(str[i] == 'n' && str[i+1] == 'j'){
            i++;
        }
        
        cnt++;
        i++;
    }
    cout << cnt;
    return 0;
}

간단하지만 복잡한 이상한 풀이였다.

가능한 풀이다만 권장하진 않는다.

필자는 이 풀이에만 30분을 썼다.

풀이를 하자면 이 방법은 문자열의 길이만큼 반복하며 문자열을 if문으로 하나씩 감지하며 감지된다면 감지하는 index를 한칸씩 옮기는 방식이다. 그리고 마지막에 횟수를 더하는 방식이다.

왜 이런 방식을 취했냐면 크로아티아 알파벳이 연속해서 겹치는 부분이 없기 때문이다.

만일 연속해서 겹쳤다면 한칸씩 옮겼을 때 중복으로 감지될 수 있기 때문이다.

그렇기에 한칸씩 옮기면 반복되지 않고 감지되었지만 처리되지 않은 index는 반복되어가며 채워진다.