맵
문제는 결국 최종까지 변경된 이름을 아이디에 맞게 반환하는 것이다. 즉 id와 함께 들어오는 이름들을 계속 변경하다가 마지막에 남은 이름을 id를 키로 하여 벡터에 집어넣어 반환하면 된다.
나의 경우 split을 구현했다. 띄어쓰기 나오는 경우까지의 문자열들을 모두 백터에 집어넣어, 이를 반환하게 한다.
answer 에는 “id 님이 들어왔다”로 먼저 집어넣은 후에, 이후 id를 ⇒ 이름 으로 변경하여 answer 값이 변하도록 한다.
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
unordered_map<string, string> m;
vector<string> split(string str) {
vector<string> v;
string temp = "";
int idx = -1;
while(++idx != str.size()) {
if(str[idx] == ' ') v.push_back(temp),temp = "";
else temp += str[idx];
}
v.push_back(temp);
return v;
}
vector<string> solution(vector<string> record) {
vector<string> answer;
// split을 통한 vector<string> 반환
for(int i=0; i<record.size(); i++) {
vector<string> sp_v = split(record[i]);
string cmd = sp_v[0];
// Enter : map에 이름을 등록 혹은 수정, answer에 "id + 님이 들어왔습니다." 추가
// Leave : answer에 "id + 님이 나갔습니다." 추가.
// Change : map에 이름 수정
if(cmd == "Enter") {
m[sp_v[1]] = sp_v[2];
answer.push_back(sp_v[1]+" 님이 들어왔습니다.");
} else if(cmd == "Leave") {
answer.push_back(sp_v[1]+" 님이 나갔습니다.");
} else {
m[sp_v[1]] = sp_v[2];
}
}
// id를 최종적으로 남은 map의 이름으로 바꾸기.
for(int i=0; i<answer.size(); i++) {
vector<string> temp = split(answer[i]);
answer[i] = m[temp[0]]+temp[1]+ " "+ temp[2];
}
return answer;
}