오픈채팅방(Level 2)
문제
접근법
이번 문제는 주어진 문자열 배열(record
)을 공백을 기준으로 분할한 뒤 해시 테이블에 id
, name
으로 등록한 후 출력하여 풀 수 있습니다. 분할할 문자열의 기준이 공백이라면 stringstream
라이브러리로 쉽게 분할 가능합니다. 따라서 다음과 같이 문제를 해결할 수 있습니다.
- stringstream을 활용하여 입력받은 명령어 문장을 3개의 문자열(
command
,id
,name
)로 나눕니다.command
가 "Enter` 일 경우idTable
에id
,name
을 새로 등록합니다.log
기록을 남깁니다. {id
, "님이 들어왔습니다."}
command
가 "Change" 일 경우idTable
에id
,name
을 다시 등록합니다.
- 'command`가 "Leave" 일 경우
log
기록을 남깁니다. {id
, "님이 나갔습니다."}
log
기록들의id
를idTable
을 참조하여name
으로 변경 후answer
배열에 저장합니다.
전체 코드
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
using namespace std;
using Table = unordered_map<string, string>;
void ProcessRecord(const string& command, const string& id, const string& name, Table& idTable, vector<vector<string>>& log)
{
if(command[0] == 'E'){ //입장
idTable[id] = name;
log.push_back({id, "님이 들어왔습니다."});
}
else if(command[0] == 'C') // 닉네임 변경
idTable[id] = name;
else // 퇴장
log.push_back({id, "님이 나갔습니다."});
}
vector<string> solution(vector<string> record) {
vector<string> answer;
Table idTable;
vector<vector<string>> log;
for(const auto& row : record)
{
stringstream ss(row);
string command, id, name;
ss >> command;
ss >> id;
if(command[0] != 'L')
ss >> name;
ProcessRecord(command, id, name, idTable, log);
}
for(const auto& row : log)
{
answer.emplace_back(idTable[row[0]] + row[1]);
}
return answer;
}
실행 결과