본문 바로가기

카테고리 없음

[C++/13022] 늑대와 올바른 단어


 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.




1. w는 첫번째로 나와야한다.
2. f로 끝났을때 다음도 w가 나와야한다. 

이 과정을 반복하자!
첫번째 w가 나오지 않으면? 그것은 올바른 값이 아니다.
w의 개수(n) 만큼  n * 4 가 해당하는 길이가 된다.
그만큼 잘라서 검증을 하고, string을 자른다.
->  잘랐을때 4의 배수가 아니라면? 그것은 옳바른 답이 아니다.
-> 또는 길이가 wolf가 전부 들어가지 않는다면 옳바른 답이 아니다.

위 내용은 제가 문제를 풀기 전에 써두었던 내용입니다. 그리고 이 문제가 구현이고 꽤나 귀찮은 문제여서 아마 29%의 정답률이 나오지 않았나 싶습니다.

저도 두번 정도 틀리고, 반복시에 다시 체크해줘야 되는 부분을 파악한 결과 정답을 얻을 수 있었습니다.

아래는 정답코드입니다. 그 char 초기화할떄 '' 이렇게 빈값으로 하면 안되더라고요? 왜 그런지는 모르겠지만 다음에 알아봐야할 것 같습니다. 그래서 'a'로 초기화했습니다.

#include<iostream>
#include<string>

using namespace std;

string wolf;

bool solve() {
	
	if(wolf[0] != 'w') return false;
	else if(wolf.length() % 4 != 0) return false;
	else{
		
		while(wolf.length() && wolf.length() % 4 == 0){
						
			int cnt = 0;
			
			if(wolf[0] != 'w') return false;
			
			for(int i = 0; i < wolf.length(); i++){
				if(wolf[i] == 'w') cnt++;
				else break;
			}
			
			int len = cnt * 4;
			if(wolf.length() < len) return false;
			
			string temp = wolf.substr(0, len);
			
			char prechar = 'a';
			
			for(int i = 0; i < temp.length(); i+=cnt){
				
				char c = temp[i];
				
				if(prechar == 'a' && c == 'w') {
					prechar = 'w';
				} else if(prechar == 'w' && c == 'o'){
					prechar = 'o';
				} else if(prechar == 'o' && c == 'l'){
					prechar = 'l';
				} else if(prechar == 'l' && c == 'f'){
					prechar == 'f';
				} else return 0;
				
				for(int j = i; j < i + cnt; j++){
					if(temp[j] != c) return false;
				}
	
			}
			
			wolf = wolf.substr(len, wolf.length());

		}
		return true;
	}
	
}

int main() {
	
	cin >> wolf;
	if(solve()) cout << 1;
	else cout << 0;
	
	return 0;
}