반응형
처음에는 문자열 입력을 받고, 각 크로아티아 알파벳 마다 문자열 내에서 찾아, 0 등의 임의문자로 대치한 후 총 알파벳 수를 세아리려고 했다. 하지만, 그렇게 하면 반복을 많이 하기 때문에, 문자열의 첫 글자부터 시작하여 한 글자씩 크로아티아 알파벳에 해당하는지 확인하기로 했다. 그러기 위해 switch-case를 이용했다.
큰 틀에서 for문으로 각 문자를 확인한다. 문자에 도달하면 일단 수를 세어준다. 이제, 크로아티아 알파벳에 해당하는지 검사하는데, 크로아티아 알파벳에 해당하면 그 길이만큼 인덱스를 건너 뛴다. 예를 들어 dz= 같은 경우는 인덱스를 두 문자 건너 뛰는 방식이다.
이 문제를 풀며 두 번의 실수가 있었다. 아래 코드는 첫 번째 실수이다. switch-case의 이해 부족으로 인해 아래와 같은 실수를 했다. 각 case를 break 없이 연달아 쓰면 || 연산자와 같은 의미로 작동된다. 따라서 아래 코드는 'd' case 작업을 마친 뒤, 'c' ~ 'z' case의 작업도 진행한다. 따라서, 각 케이스의 작업을 마친 후 continue를 사용하여 바로 다음 반복으로 넘어가도록 했다.
int count = 0;
for (int i = 0; str[i] != 0;) {
switch (str[i]) {
case 'd':
if (i + 2 < 100) {
if (str[i + 1] == 'z' && str[i + 2] == '=') {
i += 3;
break;
}
}
else if (i + 1 < 100) {
if (str[i + 1] == '-') {
i += 2;
break;
}
}
case 'c':
case 's':
case 'z':
if (i + 1 < 100)
if (str[i + 1] == '=' || str[i + 1] == '-') {
i += 2;
break;
}
case 'l':
case 'n':
if (i + 1 < 100)
if (str[i + 1] == 'j') {
i += 2;
break;
}
default:
i++;
}
count++;
}
아래 코드는 두 번째 실수다. 언뜻보면 문제가 없어보인다. 하지만 'd'case에서dz=와 d-를 구분하려 else if를 썼는데, 불필요한 else 때문에 d-를 확인하지 못 한다. "d-d"와 같은 반례에서 오답을 내놓는다.
int count = 0;
for (int i = 0; str[i] != 0;) {
count++;
switch (str[i]) {
case 'd':
if (i + 2 < 100) {
if (str[i + 1] == 'z' && str[i + 2] == '=') {
i += 3;
continue;
}
}
else if (i + 1 < 100) {
if (str[i + 1] == '-') {
i += 2;
continue;
}
}
break;
case 'c':
case 's':
case 'z':
if (i + 1 < 100)
if (str[i + 1] == '=' || str[i + 1] == '-') {
i += 2;
continue;
}
break;
case 'l':
case 'n':
if (i + 1 < 100)
if (str[i + 1] == 'j') {
i += 2;
continue;
}
break;
}
i++;
}
아래는 위의 실수를 고쳐 완성한 코드다.
#define EL "\n"
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
char str[101];
cin >> str;
int count = 0;
for (int i = 0; str[i] != 0;) {
count++;
switch (str[i]) {
case 'd':
if (i + 2 < 100) {
if (str[i + 1] == 'z' && str[i + 2] == '=') {
i += 3;
continue;
}
}
if (i + 1 < 100) {
if (str[i + 1] == '-') {
i += 2;
continue;
}
}
break;
case 'c':
case 's':
case 'z':
if (i + 1 < 100)
if (str[i + 1] == '=' || str[i + 1] == '-') {
i += 2;
continue;
}
break;
case 'l':
case 'n':
if (i + 1 < 100)
if (str[i + 1] == 'j') {
i += 2;
continue;
}
break;
}
i++;
}
cout << count << EL;
return 0;
}
반응형
'프로그래밍 > PS' 카테고리의 다른 글
[C++] 백준 1011번: Fly me to the Alpha Centauri (0) | 2020.10.19 |
---|---|
[C++] 백준 1193번: 분수찾기 (0) | 2020.10.19 |
[C++] 백준 1074번: Z (0) | 2020.10.18 |
[C++] 백준 2630번: 색종이 만들기 (0) | 2020.10.18 |
[C++] 백준 2667번: 단지번호붙이기 (0) | 2020.10.11 |