[백준] 2941번 크로아티아 알파벳 C++ 문제 풀이 문자열

2019. 11. 12. 10:50알고리즘/백준

728x90
반응형

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

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


예제 입력 1

ljes=njak


예제 출력 1

6


예제 입력 2

ddz=z=


예제 출력 2

3


예제 입력 3

nljj


예제 출력 3

3


예제 입력 4

c=c=


예제 출력 4

2


문제 풀이

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<string> vec = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
    int index = 0;
    string S;
    cin>>S;
    for(int i=0; i<vec.size(); i++){
        index = S.find(vec[i]);
        for(; index != string::npos; index = S.find(vec[i]))
            S.replace(index, vec[i].length(), "@");
    }
    cout<<S.length();
}

string.find("") 함수는 파라미터로 받은 문자열이 string에 포함되어 있는지 확인하는 함수입니다.

문자열이 존재한다면 해당 문자열이 시작되는 처음 위치를 리턴합니다.

문자열이 존재하지 않는다면 string::npos를 리턴합니다.

 

여러 방법이 있지만 저는 크로아티아 알파벳이 있는지 확인한 뒤, 

그 입력받은 문자열의 시작 위치부터 길이만큼 잘라내기를 생각했었습니다.

하지만 잘라냈을 경우 for 문에서의 문제도 생기고,

앞의 문자와 뒤의 문자가 합쳐지면서 크로아티아 알파벳이 완성되면 안 되기 때문에  string.replace() 함수를 사용하여 문자열을 전혀 상관없는 특수문자로 대체하였습니다.

 

string.replace() 함수의 각 파라미터 뜻은 string.replace(문자열의 시작 위치, 문자열의 길이, 대체 문자)입니다.

replace 함수가 문자열 길이에 제약받지 않으므로 @ 하나로 대체한 뒤,

최종적으로 문자열 길이를 구하게 되면 일반 알파벳들 개수 + 대체된 크로아티아 알파벳(@) 개수가 됩니다.

 

 

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

 

2941번: 크로아티아 알파벳

문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= 예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고,

www.acmicpc.net

 

728x90
반응형