문제 링크입니다: https://www.acmicpc.net/problem/9536
버퍼를 비워주는 것이 핵심이였던 문제였습니다.
알고리즘은 아래와 같습니다.
1. 테스트 케이스 수를 입력받은 뒤 버퍼를 비워줘야 울음소리를 getline을 통해 정상적으로 입력됩니다.
2. 어떤 동물이 어떻게 우는지가 문자열로 주어지므로 map을 통해 울음소리만 저장해줍니다.
3. 끝에 문자열이 "say?"라면 질의이므로 문자열을 그만 입력받습니다.
4. 이제 1번에서 입력받은 울음소리를 쭉 탐색하며 map에 저장되어있지 않은 울음소리들을 벡터에 넣습니다.
5. 벡터의 내용물을 출력해주면 됩니다!
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int test_case;
cin >> test_case;
cin.clear();
//cin에 남아있는 버퍼 flush
string flush_buffer;
getline(cin, flush_buffer);
for (int i = 0; i < test_case; i++)
{
string s;
getline(cin, s);
string temp;
map<string, bool> visited;
while (1)
{
getline(cin, temp);
string a;
bool question = false;
for (int j = temp.length() - 1; j >= 0; j--)
if (temp[j] == ' ')
{
reverse(a.begin(), a.end());
//질의가 나오면 break
if (a == "say?")
{
question = true;
break;
}
//울음소리를 저장한다
visited[a] = true;
break;
}
else
a += temp[j];
if (question)
break;
}
temp.clear();
vector<string> result;
for (int j = 0; j < s.length(); j++)
{
if (s[j] == ' ')
{
//저장되지 않은 울음소리는 벡터에 추가
if (!visited.count(temp))
result.push_back(temp);
temp.clear();
}
else
temp += s[j];
}
//마지막 단어
if (!visited.count(temp))
result.push_back(temp);
for (int j = 0; j < result.size(); j++)
cout << result[j] << " ";
cout << "\n";
}
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 3613번 Java vs C++ (0) | 2018.10.28 |
---|---|
백준 2810번 컵홀더 (0) | 2018.10.28 |
백준 5525번 IOIOI (0) | 2018.10.28 |
백준 1062번 가르침 (5) | 2018.10.28 |
백준 2804번 크로스워드 만들기 (0) | 2018.10.27 |