프로그래머스/lv2/42888. 오픈채팅방 2019 KAKAO BLIND RECRUITMENT

SITY·2023년 10월 27일
0

Cpp_Algorithm

목록 보기
35/43

#include <string>
#include <vector>
#include <map>
#include <sstream>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<pair<string, string>> log;
    vector<string> answer;
    map<string, string> m;
    string command, uid, name;
    for (int i = 0; i < record.size(); i++) {
        stringstream ss(record[i]);
        ss >> command >> uid >> name;
    
        if (command == "Enter" || command == "Change")
            m[uid] = name;
        if (command == "Enter" || command == "Leave")
            log.emplace_back(uid, command);
    }

    for (int i = 0; i < log.size(); i++) {
        if (log[i].second == "Enter")
            answer.push_back(m[log[i].first] + "님이 들어왔습니다.");
        else
            answer.push_back(m[log[i].first] + "님이 나갔습니다.");
    }

    return answer;
}

해결해야 하는 문제는 최종적으로 진행되고 난 결과를 나타내야 하는 문제다.
또한 유저는 닉네임을 바꿀 수 있기 때문에 닉네임이 바뀌어도 어떤 일을 했는지 구분할 수 있는 방법을 찾아야 한다.

유저의 ID는 변하지 않는다. 그러나 닉네임은 변할 수 있기 때문에 Map에 Key로 uid, Value로 name을 넣고, 수시로 변하는 아이디의 닉네임에 대해 갱신을 해준다. 또한 채팅방을 나갔다가 들어오는 사람들 또한 채팅에 기록이 되어있어야 한다. 그래야만 나중에 결과를 출력할 때 누가 어떤 일을 했는지 나타낼 수 있다. 그러므로 로그를 나타내기 위하여 Vector로 Log를 남긴다.

Log는 uid와 Action을 기억해야한다. 그래야만 닉네임이 변경되더라도 어느 시간에 무슨 일을 했는 지 uid를 Key로 사용해 최종적으로 갱신된 name을 Value로 받아서 출력할 수 있다.

stringstream으로 parsing한 뒤, Action이 Enter이거나 Change라면 Map을 추가나 갱신한다.
또한 Action이 Enter이거나 Leave라면 Log를 남겨 보관한다.
그리고 최종적으로 끝난 작업을 answer에 넣을 때, Action에 맞춘 메시지 형식을 uid를 이용해 갱신된 name으로 저장한 뒤 return한다.

profile
·ᴗ·

0개의 댓글