[Programmers] 오픈채팅방

김민석·2021년 5월 7일
0

프로그래머스

목록 보기
8/30

오픈채팅은 중복된 닉네임을 허용한다.

닉네임은 사용자의 아이디에 따라 구별된다.

이런 상황에서 사용자의 출입에 따른 메세지 표출이 어떻게 되는지 알아내는 문제이다.

문제풀이 전략
공통된 닉네임이 존재할 수 있지만 이 닉네임은 사용자의 아이디에 따라 구별되므로 사용자의 아이디를 key로 갖는 map 자료구조를 이용하면 된다.

닉네임이 바뀌는 경우는 오픈채팅방 내부에서 바꾸거나 나갔다가 바꿔서 들어오는 경우이다.

즉, Enter일 때 map에 해당 유저의 아이디가 이미 존재한다면 그 아이디의 닉네임을 들어올 때 닉네임으로 바꿔주고, Change 일때 역시 해당 아이디의 닉네임을 바꿔준다.

그리고 마지막으로 출력되는 전체 메세지를 변화가 다 적용된 상황에서 해야 하므로 명령어와 사용자의 아이디를 동시에 벡터에 저장한다.

벡터에 저장된 명령어와 아이디를 확인하여 해당 아이디의 최종 닉네임을 명령어에 맞게 출력해 준다.

코드

#include <string>
#include <vector>
#include <map>
#include <iostream>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    vector<pair<string,string>> v;
    map<string, string> m;
    for(int i=0;i<record.size();i++){
        string tmp = "";
        string id = "";
        string nick = "";
        int flag = 0;
        for(int j=0;j<record[i].size();j++){
            if(record[i][j] == ' '){
                flag++;
                continue;
            }
            if(flag == 0)
                tmp += record[i][j];
            else if(flag == 1)
                id += record[i][j];
            else if(flag == 2)
                nick += record[i][j];
        }
        v.push_back(make_pair(tmp, id));
        if(tmp == "Leave")
            continue;
        if(m.find(id) == m.end())
            m.insert(make_pair(id,nick));
        else
            m[id] = nick;
    }
    
    for(int i=0;i<v.size();i++){
        string str = "";
        str += m[v[i].second];
        if(v[i].first == "Enter"){
            str += "님이 들어왔습니다.";
        }else if(v[i].first == "Leave"){
            str += "님이 나갔습니다.";
        }else if(v[i].first == "Change"){
            continue;
        }
        answer.push_back(str);
    }
    return answer;
}

출처 : 프로그래머스
https://programmers.co.kr/learn/courses/30/lessons/42888

profile
김민석의 학습 정리 블로그

0개의 댓글