프로그래머스/해시
오픈채팅방
2zreal
2024. 9. 30. 15:24
코딩테스트 연습 - 오픈채팅방 | 프로그래머스 스쿨 (programmers.co.kr)
누가 들어오고 누가 나가면 채팅에 기록이 남게 된다.
만약 건오가 들어오면 "건오 님이 들어왔습니다"라는 채팅이 뜨게 되고 건오가 나가면 "건오 님이 나갔습니다"라는 채팅이 뜬다.
유저를 식별하는 아이디는 uid이다.
근데 만약 건오가 닉네임을 건우라고 변경하면 이전에 채팅에
"건오님이 들어왔습니다"
"건오님이 나갔습니다"
이 부분이
"건우님이 들어왔습니다"
"건우님이 나갔습니다"
로 바뀐다. 위 같이 입출력이 주어질 때 오른쪽 vector를 반환해야 한다.
문제해결방법
1. 우선 입력으로 들어오는 record부분의 값을 차례대로 읽어 들인다.
2. HashMap을 이용하는데 uid부분의 key가 되고 nickname부분이 value가 된다.
3. uid와 action에 의한 행위를 vector <pair <string, string>> result에 저장한다.(닉네임이 언제든지 변경될 수 있기 때문이다.)
4. HashMap과 result를 이용해서 마지막 answer을 생성하고 반환한다.(변경된 닉네임이 적용됨.)
입력을 차례대로 읽어들이는 부분이 생소할 수 있는데 이 부분은 istringstream을 이용해서 입력을 차례대로 읽어들인다.
istringstream은 공백을 기준으로 문자열을 파싱하여 형식에 맞게 변환해준다.
#include <string>
#include <unordered_map>
#include <vector>
#include <sstream>
using namespace std;
vector<string> solution(vector<string> record) {
vector<string> answer;
vector<pair<string, string>> result;
unordered_map<string, string> hashMap;
for (const string& entry : record) {
istringstream iss(entry);
string action, uid, nickname;
iss >> action >> uid >> nickname;
if (action == "Enter")
{
hashMap[uid] = nickname;
result.push_back({ uid, "님이 들어왔습니다." });
}
else if (action == "Leave")
{
result.push_back(make_pair(uid, "님이 나갔습니다."));
}
else if (action == "Change")
{
hashMap[uid] = nickname;
}
}
for (int i=0; i< result.size(); i++)
{
answer.push_back(hashMap[result[i].first] + result[i].second);
}
return answer;
}