오픈채팅은 중복된 닉네임을 허용한다.
닉네임은 사용자의 아이디에 따라 구별된다.
이런 상황에서 사용자의 출입에 따른 메세지 표출이 어떻게 되는지 알아내는 문제이다.
문제풀이 전략
공통된 닉네임이 존재할 수 있지만 이 닉네임은 사용자의 아이디에 따라 구별되므로 사용자의 아이디를 key로 갖는 map 자료구조를 이용하면 된다.
닉네임이 바뀌는 경우는 오픈채팅방 내부에서 바꾸거나 나갔다가 바꿔서 들어오는 경우이다.
즉, Enter일 때 map에 해당 유저의 아이디가 이미 존재한다면 그 아이디의 닉네임을 들어올 때 닉네임으로 바꿔주고, Change 일때 역시 해당 아이디의 닉네임을 바꿔준다.
그리고 마지막으로 출력되는 전체 메세지를 변화가 다 적용된 상황에서 해야 하므로 명령어와 사용자의 아이디를 동시에 벡터에 저장한다.
벡터에 저장된 명령어와 아이디를 확인하여 해당 아이디의 최종 닉네임을 명령어에 맞게 출력해 준다.
코드
#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
vector<string> solution(vector<string> record) {
vector<string> answer;
vector<pair<string,string>> v;
map<string, string> m;
for(int i=0;i<record.size();i++){
string tmp = "";
string id = "";
string nick = "";
int flag = 0;
for(int j=0;j<record[i].size();j++){
if(record[i][j] == ' '){
flag++;
continue;
}
if(flag == 0)
tmp += record[i][j];
else if(flag == 1)
id += record[i][j];
else if(flag == 2)
nick += record[i][j];
}
v.push_back(make_pair(tmp, id));
if(tmp == "Leave")
continue;
if(m.find(id) == m.end())
m.insert(make_pair(id,nick));
else
m[id] = nick;
}
for(int i=0;i<v.size();i++){
string str = "";
str += m[v[i].second];
if(v[i].first == "Enter"){
str += "님이 들어왔습니다.";
}else if(v[i].first == "Leave"){
str += "님이 나갔습니다.";
}else if(v[i].first == "Change"){
continue;
}
answer.push_back(str);
}
return answer;
}
출처 : 프로그래머스
https://programmers.co.kr/learn/courses/30/lessons/42888