Programmers/Level 2

C++ / 프로그래머스 / 오픈채팅방

GitHubSeob 2022. 4. 13. 00:28
문제

 

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

문제풀이

 

logs는 vector <pair <int, string>>이다. int에는 입장인지 퇴장인지를 나타내는 0, 1을, string에는 uID를 기록한다.

(입장과 퇴장이 string형으로 주어지지만 편의상 0과 1로 나타내기로 함)

unordered_map <string, string> uid의 key는 uID, value에는 닉네임이 저장된다.

logs에는 입장, 퇴장을 순서대로 기록한다.

 

    for (int idx = 0; idx < record.size(); ++idx) {
        istringstream iss(record[idx]);
        string nickname(""), s_uid(""), s_IO("");
        iss >> s_IO >> s_uid >> nickname;

        if (s_IO == "Enter") {
            logs.push_back({ 0, s_uid });
            uid[s_uid] = nickname;
        }
        else if (s_IO == "Leave") {
            logs.push_back({ 1, s_uid });
        }
        else if (s_IO == "Change") {
            uid[s_uid] = nickname;
        }
    }

 

istringstream을 이용해 문자열을 분리한다.

만약 입장했다면 logs에 {0, uID}를 push 하고 uid [uID]를 nickname으로 바꾼다.

만약 퇴장했다면 logs에 {1, uID}를 push 한다.

만약 닉네임을 바꿨다면 uid [uID]를 nickname으로 바꾼다.

 

    for (int idx = 0; idx < logs.size(); ++idx) {
        string str("");
        str += uid[logs[idx].second];
        
        if (logs[idx].first == 0) str += "님이 들어왔습니다.";
        else if (logs[idx].first == 1) str += "님이 나갔습니다.";
        
        answer.push_back(str);
    }

 

logs에 기록된 순으로 문자열을 만들어 answer에 push 한다.

0이면 들어왔다고 표시한 것이므로 닉네임이 저장된 str 뒤에 "님이 들어왔습니다."를,

1이면 나갔다고 표시한 것이므로 닉네임이 저장된 str 뒤에 "님이 나갔습니다."를 더한다.

 

코드
#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>
#define pis pair<int, string>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    vector<pis>logs;
    unordered_map<string, string>uid;
    
    for (int idx = 0; idx < record.size(); ++idx) {
        istringstream iss(record[idx]);
        string nickname(""), s_uid(""), s_IO("");
        iss >> s_IO >> s_uid >> nickname;

        if (s_IO == "Enter") {
            logs.push_back({ 0, s_uid });
            uid[s_uid] = nickname;
        }
        else if (s_IO == "Leave") {
            logs.push_back({ 1, s_uid });
        }
        else if (s_IO == "Change") {
            uid[s_uid] = nickname;
        }
    }

    for (int idx = 0; idx < logs.size(); ++idx) {
        string str("");
        str += uid[logs[idx].second];
        
        if (logs[idx].first == 0) str += "님이 들어왔습니다.";
        else if (logs[idx].first == 1) str += "님이 나갔습니다.";
        
        answer.push_back(str);
    }

    return answer;
}