문제설명이 길지만 요약해보자면 채팅방에 나가고 들어오는 것을 기록하고 아이디에 대한 닉네임은 제일 마지막에 사용자가 등록한 것으로 사용한다.
일단 공백을 기준으로 문자열을 나누는것이 중요하다.
문자열을 나누는 방법은 나는 sstream을 자주 사용해서 이 방법을 같이 첨부한다.
※sstream 활용
stringstream ss;
for (auto reco : record) {
ss.str(reco); //record배열에서 하나씩 가져와서 string 형태로 변환
string status, id, name; //빈칸을 기준으로 나눌 단어를 넣을 변수
ss >> status >> id >> name; //string 형태로 변환된 단어를 분할하여 변수에 차례로 저장
ss.clear(); //ss을 초기화하여 다음 요소를 분할할 수 있도록 함.
}
이후 map을 사용하여 기록된 아이디와 닉네임을 추가하는 방법까지는 생각했는데 이 다음이 잘 생각나지않았는데 힌트를 보니 굳이 map에서 전부다 계산하는 것보다 행동과 아이디를 나누어서 나중에 더해주는 방식이 좋을 것 같아 그렇게 해보았다.
전체코드
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
//닉네임은 맵을 통해 최신화해주기
//나머지는 어떻게 저장해둘것인가..
//->따로 배열을 만들어서 저장하는게 좋겠다=> state배열 answer에는 id만 저장해서 나중에 합쳐주기
vector<string> solution(vector<string> record) {
vector<string> answer, state;
map<string, string> m;
stringstream ss;
for (auto reco : record) {
ss.str(reco);
string status, id, name;
ss >> status >> id >> name;
ss.clear();
if (status == "Enter") {
state.push_back("님이 들어왔습니다.");
answer.push_back(id); //id를 저장해서 나중에 state와 map을 합치기
m[id] = name;
}
else if (status == "Leave") {
state.push_back("님이 나갔습니다.");
answer.push_back(id);
}
else {
m[id] = name;
}
}
for (int i = 0; i < answer.size(); i++) {
answer[i] = m[answer[i]] + state[i];
}
return answer;
}