백준/C++

[백준] 2941번: 크로아티아 알파벳 | C++ 풀이

성실한 당근농부 2023. 5. 24. 23:36

# 문제

단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

 

 


 

# 풀이

드디어 등장한 실버...

문자열 탐색과 관련한 문제다. 코드도 길지 않고 풀만하니 차분히 확인해보자.

정답 소스코드부터!

 

#include <iostream>
#include <string>
using namespace std;

int count(string str);
int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제
    cin.tie(NULL);	// 입력과 출력 묶음을 풀기

    string s;
    cin >> s;    
    cout << count(s);
    return 0;
}

int count(string str){
    string alphabet[8] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

    for(int i=0; i<8; i++){
        while(1){
            if(str.find(alphabet[i]) != -1){
                str.replace(str.find(alphabet[i]), alphabet[i].length(), "#");
            }else break;
        }
    }
    return str.length();
}

 

해당 문제는 #include <string>를 추가해 그 안에 구현되어 있는 기능을 사용해야 한다.

오늘 사용할 것은 findreplace로, 각 키워드에 레퍼런스 사이트를 링크해두었으니 아직 익숙하지 않다면 하나씩 확인해보고 넘어가자.

 

 


 

 

int count(string str){
    string alphabet[8] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

    for(int i=0; i<8; i++){
        while(1){
            if(str.find(alphabet[i]) != -1){
                str.replace(str.find(alphabet[i]), alphabet[i].length(), "#");
            }else break;
        }
    }
    return str.length();
}

 

아직 매우 짧은 코드지만 크로아티아 알파벳을 카운팅 해주는 함수를 별도로 구현해주었다.

우선 변경되어 입력된 크로아티아 알파벳을 찾기 위해, 해당 알파벳들이 담긴 배열을 하나 선언해준다.

 

이후 입력된 단어를 탐색하며 해당 문자를 찾을 수 있다면 (반환된 값이 npos 값이 아니라면) 찾은 알파벳을 #으로 바꿔주었다. 이는 개수를 세기 쉽게 하기 위함도 있고 "dz=", " z="등 유사하게 생긴 변환 알파벳을 중복의 가능성 없이 처리해주기 위함도 있다.

탐색이 끝난 후엔 변환된 단어의 길이를 반환해주면 끝이다.

 

예를 들어,

입력이 ljes=njak였다면 #e##ak으로 변환되어 6이 반환

ddz=z=였다면 d##으로 변환되어 3이 반환된다.

 

 

 

 


 

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

728x90