반응형
해당 문제는 백준 사이트에서 풀 수 있습니다.
1. 문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경
č | c= |
ć | c- |
dž | 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;
}
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
백준 11053] C++ 가장 긴 증가하는 부분 순열 (0) | 2020.11.13 |
---|---|
백준 2941] C++ 그룹 단어 체커 (0) | 2020.11.12 |
백준 7569] C++ 토마토(3차원) (0) | 2020.11.10 |
백준 13913] C++ 벽 부수고 이동하기 (0) | 2020.11.09 |
백준 13913] C++ 숨바꼭질4 (0) | 2020.11.08 |
댓글