[2019 KAKAO BLIND RECRUITMENT] 오픈채팅방- C++

프로그래머스

Posted by dongjune on December 22, 2020

문제

프로그래머스 - 오픈채팅방

풀이

우선 이름의 갱신을 편리하게 하기위해 unordered map을 사용하였습니다. map은 key 값이 중복되지 않는다는 특성이 있기 때문에 다음과 같이 간편하게 Id의 이름을 갱신할 수 있습니다.

1
2
3
4
5
unordered_map<string,string> um; // [key:value] = [id:name]

// ....

um[id] = newName; // id의 이름 갱신

record 벡터를 반복문으로 순회하며 각 문자열마다 Action, Id, Name 을 추출해주고 위의 코드와 같이 Id에 대한 이름을 매번 갱신해줬습니다.
Action과 Id 정보는 temp vector에 계속 넣어줍니다.

record의 순회가 끝나면 다음과 같이 temp vector를 순회하며 메시지를 answer 벡터에 넣어줍니다.

1
2
3
4
5
6
7
8
for(auto iter : temp){
    string action = iter.first;
    string id = iter.second;
    if(action=="Enter")
        answer.push_back(um[id]+"님이 들어왔습니다.");
    else if(action=="Leave")
        answer.push_back(um[id]+"님이 나갔습니다.");
}

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    unordered_map<string,string> um; // key=Id, value=name
    vector<pair<string,string>> temp; // Action과 Id 정보를 저장하는 벡터

    for(auto s:record){
        int start=0;
        vector<string> actionIdName;

        // 문자열을 공백을 기준으로 Action, Id, Name으로 나누는 과정
        for(int i=0;i<s.length();i++){
            if(s[i]==' '){
                actionIdName.push_back(s.substr(start,i-start));
                start=i+1;
            }
        }
        if(actionIdName[0]!="Leave")
            um[actionIdName[1]] = s.substr(start);
        else
            actionIdName.push_back(s.substr(start));

        temp.push_back({actionIdName[0],actionIdName[1]});
    }

    for(auto iter : temp){
        string action = iter.first;
        string id = iter.second;
        if(action=="Enter")
            answer.push_back(um[id]+"님이 들어왔습니다.");
        else if(action=="Leave")
            answer.push_back(um[id]+"님이 나갔습니다.");
    }


    return answer;
}