Algorithm

백준 9536번 여우는 어떻게 울지?

이무쿤 2020. 2. 5. 20:17
반응형

문제

고대 미스테리로 전해지는 여우의 울음소리를 밝혀내기 위해 한신이는 고성능 녹음기로 무장하고 숲으로 들어갔다. 하지만 숲에는 동물들이 가득해, 녹음된 음성에는 다른 동물들의 울음소리가 섞여 있다. 그러나 한신이는 철저한 준비를 해 왔기 때문에 다른 동물들이 어떤 울음소리를 내는지 정확히 알고 있다. 그러므로 그 소리를 모두 걸러내면 남은 잡음은 분명히 여우의 울음소리일 것이다.

입력

첫 번째 줄에는 테스트케이스의 개수 T가 입력된다. 각 테스트케이스는 아래와 같이 구성되어 있다.

테스트케이스의 첫 줄에는 몇 개의 단어로 이루어진 녹음된 소리가 입력된다. 단어는 알파벳 소문자로만 이루어져 있으며 공백으로 구분된다. 단어의 길이는 최대 100글자이고, 단어의 개수는 최대 100개이다. 다음 줄부터는 여우를 제외한 동물들의 울음소리가 <동물> goes <소리>의 형태로 입력된다. 최소 1마리, 최대 100마리이며, 이름은 최대 100글자이고 실제로 존재하는 동물의 이름이다. 여우를 제외한 동물의 울음소리는 한 단어이고 최대 100글자이다.

마지막 줄에는 한신이가 알고 싶어하는 질문이 주어진다. what does the fox say?

출력

각 테스트케이스마다 여우의 울음소리를 한 줄씩, 녹음된 순서대로 출력한다. 여우의 울음소리가 녹음되어 있음이 보장된다. (알려진 것과는 달리, 여우는 모스 부호로 의사소통하지 않는다.)

1. getline()

공백을 입력 받을 때 사용 

cin 먼저 사용하고 받을 시에 , cin은 입력 후 엔터의 \n가 버퍼에 남으므로 그 이후 getline은 엔터만 받고 종료됨

따라서 버퍼를 위한 getline()하나 더 두고 해야 함.

2. 공백 기준으로 구분 법. 

공백이 나올 때 까지 하나의 string에 모아줌. 그리고 공백일 때 해당 string으로 처리해 주고 다시 clear 

마지막 문자열은 뒤로 공백이 더이상 안나오므로 반복문 밖에서 처리.

 

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;


map<string,bool> m;

int main(void)
{
	int test_case;

    cin >> test_case;
	string flush_buffer;
    getline(cin, flush_buffer);
	
	for(int i = 0; i < test_case; i++)
	{
		string str;
		getline(cin,str);
		
		
		bool check = false;
		while(1)
		{
			string temp;
			getline(cin,temp);
			
			for(int j = 0; j <temp.size(); j++)
			{
				if(temp[j] == 's' && temp[j+1] == 'a' && temp[j+2] == 'y')
				{
					check = true;
					break;
				}
			}
			
			if(check)
			{
				break;
			}
			
			string a;
			for(int j = temp.size()-1; j >= 0; j--)
			{
				if(temp[j] == ' ')
				{
					reverse(a.begin(),a.end());
					m[a] = true;
					a.clear();
					break;
					
				}
				
				a += temp[j];
					
			}
			
			
		}
		string result;
		vector<string> stvec;
		for(int j = 0; j < str.size(); j++)
		{
			if(str[j] == ' ')
			{
				if(!m[result])
				{
					stvec.push_back(result);
					
				}
				result.clear();	
			}
			else
			{
				result += str[j];				
			}
			
		}
		
		if(!m[result])
		{
			stvec.push_back(result);
			result.clear();
		}
		
		for(int j = 0; j < stvec.size(); j++)
		{
			cout << stvec[j]<<" ";
		}
		cout << endl;
	}
	
	
	
}
반응형