<답안>
#include <iostream>
using namespace std;
int main() {
string input;
string temp;
int count = 0;
int i = 0;
cin>>input;
while(i<input.size())
{
if(i<input.size()-1) {
temp = input.substr(i,2);
if (temp == "c=") {
count++;
i+=2;
} else if (temp == "c-") {
count++;
i+=2;
} else if (temp == "d-") {
count++;
i+=2;
} else if (temp == "lj") {
count++;
i+=2;
} else if (temp == "nj") {
count++;
i+=2;
} else if (temp == "s=") {
count++;
i+=2;
} else if (temp == "z=") {
count++;
i+=2;
} else if (i == input.size()-2) {
count+=2;
i+=2;
} else {
if (i < input.size()-2) {
temp = input.substr(i,3);
if (temp == "dz=") {
count++;
i+=3;
}
else {
count++;
i++;
}
}
}
}
else {
count++;
i++;
}
}
cout<<count;
return 0;
}
<설명>
일단 내가원하는 깔끔한 느낌의 코드는 아닌듯해서 더 좋은 코드가 있을꺼 같다
string 형태로 문장을 input에 입력받는다
for 대신하여 while을 통해 비교글자 인덱스인 i값을 통해 i가 size() 보다 작을경우만 반복하도록 설정한다
이유는, "c=" 등 2글자 비교시 맞는경우 i를 2 증가시키는 경우도 있고, "dz=" 비교시 맞는경우 i를 3 증가시키는 경우도 있기 때문에
하나씩 증가시키는 for 대신하여 while을 사용하였다
while 반복시 인덱스 i를 size()-1 까지 허용한 이유는 마지막 글자 하나만 남은경우도 비교가 필요하기 때문에 size()-1까지 비교를 해야한다
다만, "c="을 비롯한 크기가2인 문장비교시 다음글자를 비교하려는 순간 범위를 벗어나는 에러가 발생한다
따라서 while은 i=0 ~ size()-1 까지 해당되지만 i값이 size()-2 이전에(i < size()-1) 해당되는 경우에만 뒷글자를 확인가능하도록 설계한다
i < size()-1 경우, 즉 뒷글자를 비교할 수 있는 경우와 마지막 글자인 i = size()-1 인 경우로 나뉜다
1. i < size()-1 경우 (뒤에 두글자 이상)
인덱스 i부터 뒷글자까지 따와서 크기가 2인 string을 temp에 저장한다 : temp = input.substr(i,2);
크기가 2인 각 크로아티아 알파벳과 비교하여 맞는경우 count는 1 증가, i는 2 증가 시키도록 한다
만약 크기2인 크로아티아 알파벳과 일치하지 않는 경우는
1. 3글자 크로아티아 알파벳인 경우
2. 그냥 알파벳인 경우이며, 이또한 i값이 마지막글자 - 1인 경우(size()-2), 그 외의 경우로 나눠진다
따라서 첫째로 크기2인 크로아티아 알파엣이 아닌 경우 중 i 값이 size()-2 인 경우는 마지막 두글자가 그냥 알파벳 이므로
count를 2 증가시키고, i를 2 증가시킨다
그 외의 경우는 뒷글자가 3개이상 남은 경우이므로 크기가3인 string을 temp에 저장하여 : temp = input.substr(i,3);
크기3 크로아티아 알파벳인 "dz="과 비교를 한다
같은 경우 count를 1 증가시키고 i를 3 증가시킨다
그 외의 경우는 뒷글자가 3개 이상 남았으면서 i번째 문자가 그냥 알파벳인 경우이므로
count를 1 증가, i를 1 증가시켜 다음글자로 넘긴다
2. i = size()-1 경우 (마지막 글자)
마지막 글자이므로 무조건 그냥 알파벳이다
따라서 count를 1 증가, i를 1증가시킨다
최종적으로 구해진 count를 출력한다
'백준 > 백준 단계별 문제풀이' 카테고리의 다른 글
백준 1712번 (C++) (0) | 2020.08.23 |
---|---|
백준 1316번 (C++) (0) | 2020.08.23 |
백준 5622번 (C++) (0) | 2020.08.22 |
백준 2908번 (C++) (0) | 2020.08.22 |
백준 1152번 (C++) (0) | 2020.08.22 |