Problem Solving/백준

[백준/c++] 13022 - 늑대와 올바른 단어

세고래 2021. 3. 24. 01:20

www.acmicpc.net/problem/13022

 

13022번: 늑대와 올바른 단어

첫째 줄에 단어가 주어진다. 단어는 w, o, l, f로만 이루어져 있으며, 길이는 50을 넘지 않는다.

www.acmicpc.net


1) 풀이

1. w, o, l, f 의 각각의 문자는 모두 동일한 횟수로 나와야 한다.

»각 글자가 나온 횟수를 세어줄 배열을 만든다

2. w가 나온 뒤에 o가 나올 수 있고, w와 o가 나온 다음에 l이 나올 수 있고 w, o, l가 나온 다음에 f가 나올 수 있다.

»횟수 세어주는 배열에서 이전의 인덱스에 들어있는 숫자가 0이상인지, 즉 한 번 이상 나왔는지 반드시 체크해준다

*배열에서 인덱스 0은 w의 횟수를 담고, 인덱스 1인 o 를 담고... 이런 식으로, 각 문자가 나와야 하는 순서대로 인덱스에 담는다

3. 단어 두개를 이어붙일 수도 있다.

»f가 제일 마지막 순서에 오기 때문에, f가 나온 다음에 f가 아닌 다른 단어가 나오면 이어붙여진 두번째 단어를 읽는다는 의미. 그때 배열의 처음부터 끝까지 살피고 올바른 단어라면 배열을 모두 0으로 초기화하여 다시 횟수를 카운팅하고, 올바른 단어가 아니라면(배열에 들어있는 숫자가 모두 같지 않다면) 0을 출력한다

 

생각보다 꽤 단순한 문제였던 것 같다!

횟수를 배열에 넣으면, 이전에 그 단어가 카운팅 되었는지의 여부도 쉽게 파악할 수 있기 때문에

배열로 문자들을 카운팅해야 한다는 것만 깨달으면 비교적 쉽게 정답이 나오는 문제😁

 

2) 최종 소스코드
#include <bits/stdc++.h>
using namespace std;
string s;
int arr[4]; //각 문자 개수 세는 배열. 0: w의 개수|1: o의 개수|2: l의 개수|3: f의 개수
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> s;
	for (auto c : s) {
		if (arr[3] > 0 && c != 'f') { //두번째 단어가 나왔다는 의미
			int num = arr[0];
			for (int i = 1; i < 4; i++) { //배열에 들어있는 횟수가 모두 동일한지 체크
				if (arr[i] != num) {
					cout << 0 << '\n';
					return 0;
				}
			}
			fill(arr, arr + 4, 0); //앞단어가 올바른 단어라면, 다음 단어가 올바른지 확인하기 위해 0으로 모두 초기화
		}
		switch (c)
		{
		case 'w': //w는 제일 처음에 나와야 한다. 즉 다른 단어들의 횟수는 모두 0이어야 함
			if ((arr[1] == 0 && arr[2] == 0) && arr[3] == 0) {
				arr[0]++;
			}
			else {//올바르지 않으면 0출력하고 바로 종료
				cout << 0 << '\n';
				return 0;
			}
			break;
		case 'o':
			if (arr[0] > 0) { //w가 한 번 이상 나왔어야 함
				arr[1]++;
			}
			else {
				cout << 0 << '\n';
				return 0;
			}
			break;

		case 'l':
			if (arr[0] > 0 && arr[1] > 0) { //w,o가 한 번 이상 나왔어야 함
				arr[2]++;
			}
			else { 
				cout << 0 << '\n';
				return 0;
			}
			break;

		case 'f':
			if ((arr[0] > 0 && arr[1] > 0) && arr[2] > 0) {//w,o,l가 한 번 이상 나왔어야 함
				arr[3]++;
			}
			else {
				cout << 0 << '\n';
				return 0;
			}
			break;

		}
	}
	int num = arr[0];
	for (int i = 1; i < 4; i++) { //배열에 들어있는 횟수가 모두 동일한지 체크
		if (arr[i] != num) { 
			cout << 0 << '\n';
			return 0;
		}
	}
	cout << 1 << '\n'; //이전에 프로그램이 종료되지 않았다면, 올바른 단어라는 의미
}
3) 참고자료
728x90