문제 푼 날짜 : 2021-06-15
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42888
유저별 닉네임을 어떻게 관리하느냐가 중요하다고 생각했다.
아래의 문제에서 주어진 조건에 따르면, 닉네임을 변경할 수 있는 경우는 아래와 같다.
채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.
1. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
2. 채팅방에서 닉네임을 변경한다.
그렇기 때문에, "Enter", "Change"일 경우에 유저별 닉네임에 대해서 최신화를 해줘야한다.
이를 위해 C++ STL 중의 map을 이용하였다.
"Enter", "Change"인 경우만 key를 유저 아이디, value를 닉네임으로 지정하여 마지막까지 업데이트를 하여 최신 유저 아이디별 닉네임 정보를 가질 수 있도록 하였다.
그 이후, "Enter", "Leave" 두 경우에 따라서 채팅방에 나타나는 메시지를 저장할 수 있도록 하였다.
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
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;
map<string, string> id_info;
for (auto str : record) {
vector<string> v = split(str, ' ');
if (v[0] == "Enter") {
id_info[v[1]] = v[2];
} else if (v[0] == "Change") {
id_info[v[1]] = v[2];
}
}
for (auto str : record) {
vector<string> v = split(str, ' ');
if (v[0] == "Enter") {
answer.push_back(id_info[v[1]] + "님이 들어왔습니다.");
} else if (v[0] == "Leave") {
answer.push_back(id_info[v[1]] + "님이 나갔습니다.");
} else {
continue;
}
}
return answer;
}
비교적 쉬운 문제여서 잘 해결할 수 있었다. 문자열을 파싱하는 방법과 C++ STL을 api를 보지 않고도 잘 사용할 수 있도록 익혀둬야 할 것 같고, 이와 관련된 문제를 더 많이 풀어봐야겠다.