반응형


 

백준 - 단계별로 풀어보기 [2941]

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

 

 

 

문제

 

 

 

최대 100글자의 문자열을 입력받고, 크로아티아 알파벳에 해당하는 문자들은 문자 1개로 계산하여 총 알파벳의 갯수를 세는 프로그램을 작성하는 문제이다.

 

 

풀이

 

 

해당 문제는 단순 if문으로 풀기보다는 크로아티아 알파벳에 해당하는 문자열들을 벡터로 선언하고, 이와 일치하는 문자열들을 변환하는 방식으로 풀 수 있다.

 

vector<string> croatian = {"c=","c-","dz=","d-","lj","nj","s=","z="};

 

그리고 String의 find 함수를 활용하여 일치하는 문자열을 String의 replace를 활용하여 #으로 변경해준뒤, 문자열의 길이를 구하면 총 크로아티아 알파벳의 개수를 구할 수 있다.

 

    for(int i = 0; i < croatian.size(); i++)
    {
        while(1){
            idx = str.find(croatian[i]);
            if(idx == string::npos)
                break;
            str.replace(idx,croatian[i].length(),"#");
        }
    }

 

위의 코드를 실행하며 크로아티아 알파벳에 해당하는 문자열들을 find를 통해 검색하고, find의 결과값이 npos가 나올 때 까지, 즉 모든 문자열을 찾을 때까지 while문을 통해 문자열을 변경해준다.

즉, c=, c-, dz=, d-, ...등등에 해당하는 문자열을 만나면 이를 #으로 변경해준다.

 

예시로 주어진 ljes=njak의 경우엔 #e##ak로 변경되어 문자열의 길이는 6을 반환하게 된다.

 

코드

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
    vector<string> croatian = {"c=","c-","dz=","d-","lj","nj","s=","z="};
    int idx;
    string str;
    cin >> str;
    for(int i = 0; i < croatian.size(); i++)
    {
        while(1){
            idx = str.find(croatian[i]);
            if(idx == string::npos)
                break;
            str.replace(idx,croatian[i].length(),"#");
        }
    }
    cout << str.length();
}

 

 

평가

 

본 문제는 string의 내부함수인 find와 replace등을 활용할 수 있는가, 없는가에 따라서 난이도가 달라질 수 있다고 생각한다.

단순히 모든 문자열을 if문으로 처리하는 경우에는 풀이는 간단하지만 코드 길이가 매우 난잡하게 길어질 수 있으며, dz=과 z=을 구분하기 위해 별도의 예외처리가 필요하므로, find를 활용하여 치환하는 방식이 효율적인 풀이 방법이라고 생각한다.

 

본 문제에서는 string  내부함수 find와 replace의 사용법을 익힐 수 있다.

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,