https://www.acmicpc.net/problem/2941
< 크로아티아 알파벳 >
크로아티아 알파벳 | 변경 |
---|---|
č | c= |
ć | c- |
dž | dz= |
ñ | d- |
lj | lj |
nj | nj |
š | s= |
ž | z= |
특정 문자열을 입력 받고 그 문자열에 크로아티아 알파벳이 몇 개 있는 지를 계산한 뒤에
크로아티아 알파벳을 제외한 나머지 알파벳을 각각 한 개로 계산하여 총 몇개의 알파벳으로 이루어져있는지 출력해주는 문제이다.
첫 번째 예시 ljes=njak를 보면,
lj, s=, nj 이렇게 세 가지의 크로아티아 알파벳이 있고 이 셋을 제외한 e, a, k 까지 합하여 총 6가지의 크로아티아 알파벳으로
이루어져 있는 것을 알 수 있다.
아직 string에 대한 이해도가 낮아 stirng 관련 함수를 최대한 사용하여 풀어보려 하였다.
단순히 find만 이용하여 문자열이 존재하는 지를 찾는 방법으로는 문제를 해결할 수 없다.
왜냐하면 dz= 를 찾고 나서는 dz=에 사용된 z=를 고려하지 말아야 하기 때문이다.
따라서 입력된 문자열을 한 알파벳씩 for문을 돌아주면서 크로아티아 알파벳이 있는지를 찾아보고, 없다면 인덱스를 1 증가시켜주고,
크로아티아 알파벳이 있다면 해당 크로아티아 알파벳의 사이즈만큼 증가시켜 주었다.
1. for i = 0 ~ 입력받은 문자열 사이즈
2. 크로아티아 알파벳 총 8개를 돌면서 입력받은 문자열의 i번 재 알파벳으로 시작하는 크로아티아 알파벳이 있는 지 확인
#include <iostream> #include <string> using namespace std; bool strcheck[101]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); string s[8] = { {"c="},{"c-"},{"dz="},{"d-"}, {"lj"},{"nj"},{"s="},{"z="} }; string temp; cin >> temp; int cnt = 0; int deleteSize = 0; for (int i = 0; i < temp.size(); ++i) { for (int j = 0; j < 8; ++j) { int size = s[j].size(); string substr = temp.substr(i, size); if (substr == s[j]) { cnt++; deleteSize += size; i += size - 1; break; } } } cout << (cnt + temp.size() - deleteSize) << '\n'; return 0; }
'알고리즘 > 백준 문제풀기' 카테고리의 다른 글
BOJ 백준 1764 듣보잡 <문자열 처리> (0) | 2019.01.03 |
---|---|
BOJ 백준 1032 명령 프롬프트 <문자열 처리> (0) | 2019.01.02 |
BOJ 백준 1475 방 번호 <문자열 처리> (0) | 2019.01.02 |
BOJ 백준 1152 단어의 개수 <문자열 처리> (0) | 2019.01.01 |
BOJ 백준 5719 거의 최단경로 <다익스트라> (0) | 2018.12.31 |