[Programmers] Level2 : 오픈채팅방
Question
- 이중 for루프로 한 문자씩 temp에 담아 공백이나 string의 end()를 만나면 각각의 trigger, userid, name을 구분하여 저장한다.
- userid는 중복이 안되기 때문에 map으로 저장한다. 같은 userid가 name이 바뀌면 해당 name으로 업데이트 시켜준다.
- Enter, Leave, Change상태와 어떤 유저가 행동을 취하였는지 알기위해 userid로 pair형태로 vector에 담아준다.
- trigger에 따라 출력문을 만들고 키값인 userid로 name을 가져와 answer에 담아준다. Change는 무시하면 된다.
Solution
Cord
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
vector<string> solution(vector<string> record)
{
vector<string> answer;
unordered_map<string, string> log; // (id, name)
vector<pair<string, string>> trigger; // (Enter Leave Change, id)
for (int i = 0; i < record.size(); ++i)
{
int cnt = 0; // 공백의 순서
string temp = "";
string key = "";
string trigg = "";
for (auto it = record[i].begin(); ; ++it)
{
// 공백이 아닌 마지막 지점
if (it == record[i].end() && cnt == 1) { key = temp; break; } // Leave는 id가 마지막
else if (it == record[i].end() && cnt == 2) { log[key] = temp; break; } // 세 번째의 끝: name 저장
if (*it != ' ') { temp += record[i][it-record[i].begin()]; }
else
{
if (cnt == 0) { trigg = temp; ++cnt; } // 첫 번째 공백: trigger 저장
else if (cnt == 1) { key = temp; ++cnt; } // 두 번째 공백: userId 저장
temp = "";
}
}
trigger.push_back({ trigg, key });
}
// Trigger에 따라 출력하기
for (int i = 0; i < trigger.size(); ++i)
{
string temp;
if (trigger[i].first == "Enter")
{
temp = log[trigger[i].second] + "님이 들어왔습니다.";
answer.push_back(temp);
}
else if (trigger[i].first == "Leave")
{
temp = log[trigger[i].second] + "님이 나갔습니다.";
answer.push_back(temp);
}
}
return answer;
}