프로그래머스 - 오픈채팅방 (Lv.2)

less than 1 minute read

문제 링크

문제 접근

  • 문제를 쉽게 만들어 준 부분은 최종적으로 보게 되는 메세지 히스토리를 구하면 된다는 점이다.
  • 즉, 사용자가 아무리 이름을 바꿔도 userID 에 따라 바뀌는 이름을 매핑 해놓으면 된다. 따라서 map 자료구조를 활용한다.
  • 메세지 히스토리는 시간 순서로 담겨야 하므로 벡터 컨테이너를 활용하였고, pair 자료구조로 userId 와 state를 매핑하여 기록하도록 한다.

구현(All Pass)

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

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    
    stringstream ss;
    string state, userID, name;
    map<string, string> table; // userID 별 name 테이블
    vector<pair<string, string>> msgList; // userID 별 state 로 msg 기록
    for(int i=0; i<record.size(); i++){
        ss.clear();
        ss.str(record[i]);
        ss >> state >> userID;
        if(state=="Leave"){
            msgList.push_back(make_pair(userID, state));
            continue;
        }
        ss >> name;
        if(state=="Enter"){
            table[userID] = name;
            msgList.push_back(make_pair(userID, state));
        }
        else if(state=="Change"){
            table[userID] = name;
        }
    }
    
    string msg;
    for(int i=0; i<msgList.size(); i++){
        userID = msgList[i].first;
        state = msgList[i].second;
        name = table[userID];
        msg = name + string("님이 ");
        if(state=="Enter")
            msg += string("들어왔습니다.");
        else if(state=="Leave")
            msg += string("나갔습니다.");
        answer.push_back(msg);
    }
    
    return answer;
}
  • stringstream 은 문자열 파싱에 유용하다.

Leave a comment