#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>
#include <utility>
using namespace std;
// 문자열을 split하는 방법, sstream을 사용한다.
vector<string> split(string input, char delimiter) {
vector<string> answer;
stringstream ss(input);
string temp;
while (getline(ss, temp, delimiter)) {
answer.push_back(temp);
}
return answer;
}
vector<string> solution(vector<string> record) {
vector<string> answer;
// unordered_map으로 닉네임들을 정리한다.
unordered_map<string, string> urd;
// pair형 vector로 지금까지 오간 id들을 정리한다.
vector<pair<string, int> > roomSeq;
for(int i=0; i<record.size(); i++){
// split을 하여 해동, id, 닉네임 으로 나눈다.
vector<string> tmp = split(record[i], ' ');
// change가 아닐 경우이다.
if(tmp.size() == 3){
// leave가 있다는것을 생각하지 못함.... 제대로 보고 하기
// 해당 id가 존재할 경우 unordred_map에 적힌 닉네임을 바꿔주었다.
if(urd.count(tmp[1])){
urd[tmp[1]] = tmp[2];
}
else{
// 해당 id가 없을 경우 새롭게 추가해주었다.
urd.insert(make_pair(tmp[1], tmp[2]));
}
}
// Enter인지 Leave인지 구별해주는 변수
int flag = 0;
if(tmp[0] == "Enter") flag = 1;
else if(tmp[0] == "Leave") flag = -1;
// change일 경우 더 이상 필요가 없을 경우 패스한다.
else continue;
roomSeq.push_back(make_pair(tmp[1], flag));
}
for(int i=0; i<roomSeq.size(); i++){
string s;
if(roomSeq[i].second == 1){
s = urd[roomSeq[i].first] + "님이 들어왔습니다.";
}
else{
s = urd[roomSeq[i].first] + "님이 나갔습니다.";
}
answer.push_back(s);
}
return answer;
}
unordered_map과 vector를 같이 쓰면서 서로 비교해가는 문제가 흥미로웠다. 또한 c++에서 split하는 법을 꼭 알아두어야한다. unordered_map을 사용하는 매우 좋은 문제였으므로 잘 기억해서 복습하자.