본문 바로가기

프로그래밍/PS

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

반응형

문제 바로가기

처음에는 문자열 입력을 받고, 각 크로아티아 알파벳 마다 문자열 내에서 찾아, 0 등의 임의문자로 대치한 후 총 알파벳 수를 세아리려고 했다. 하지만, 그렇게 하면 반복을 많이 하기 때문에, 문자열의 첫 글자부터 시작하여 한 글자씩 크로아티아 알파벳에 해당하는지 확인하기로 했다. 그러기 위해 switch-case를 이용했다.

큰 틀에서 for문으로 각 문자를 확인한다. 문자에 도달하면 일단 수를 세어준다. 이제, 크로아티아 알파벳에 해당하는지 검사하는데, 크로아티아 알파벳에 해당하면 그 길이만큼 인덱스를 건너 뛴다. 예를 들어 dz= 같은 경우는 인덱스를 두 문자 건너 뛰는 방식이다.

이 문제를 풀며 두 번의 실수가 있었다. 아래 코드는 첫 번째 실수이다. switch-case의 이해 부족으로 인해 아래와 같은 실수를 했다. 각 casebreak 없이 연달아 쓰면 || 연산자와 같은 의미로 작동된다. 따라서 아래 코드는 '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;
}
반응형