본문 바로가기
코딩테스트/백준

백준 2941] C++ 크로아티아 알파벳

by Hwan2 2020. 11. 12.
728x90
반응형

 

 

 

 

 

 

 

 

 

 

해당 문제는 백준 사이트에서 풀 수 있습니다.

 

www.acmicpc.net/problem/2941

 

1. 문제

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

 

크로아티아 알파벳변경

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

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

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

 

입력

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

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

 

2. 조건

1. 주어지는 알파벳의 모든 단어의 갯수를 구해야 한다.

2. 단, 크로아티아 알파벳을 위 표대로 치환하여 입력했기 때문에, 치환된 알파벳을 찾아서 갯수를 잘 새어야 한다.

 

3. 풀이

map을 이용하면 쉽게 풀 수 있습니다.

입력된 문자열 기준으로 substr() 을 사용해 데이터 갑이 일치하면 i의 검색범위를 늘려주는 식으로 구현하면 됩니다.

알파벳 'd'로 시작하는 경우 3글자인 "dz="과 2글자인 "d-"가 있기 때문에 2번 검사해 줍니다.

그외엔 map의 기능 find를 통해 key를 찾아주면 끝.

 

4. 코드

#include <iostream>
#include <vector>
#include <queue>
#include <map>

#pragma warning(disable: 4996)

using namespace std;

int main() {
    int T;
    int N, M, K, H;
    int X, Y;
    int answer = 0;

    string s;
    
    map<string, int> m;
    
    m["c="] = 1;
    m["c-"] = 1;
    m["dz="] = 1;
    m["d-"] = 1;
    m["lj"] = 1;
    m["nj"] = 1;
    m["s="] = 1;
    m["z="] = 1;

    cin >> s;

    for (int i = 0; i < s.size(); i++) {
        string temp = "";
        
        if (s[i] == 'd') {
            temp = s.substr(i, 3);

            if (m.find(temp) != m.end()) 
                i += 2;
            
            temp = s.substr(i, 2);
            if (m.find(temp) != m.end())
                i += 1;
                
            answer++;
        }
        else {

            temp = s.substr(i, 2);
            if (m.find(temp) != m.end()) 
                i += 1;
            
            answer++;
        }
    }
  
    cout << answer << endl;
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서