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

Byungwoong An·2021년 7월 1일

문제


풀이전략

  1. 문제에서 중요한 것은 변하는 것과 변하지 않는 것이다. 변하는 것은 닉네임이고 변하지 않는것은 Id이다. 따라서 Id를 저장해 놓는 벡터를 하나 만들어 놓고, Id는 계속 변하므로 Id를 또 따로 저장해두어야 한다.
  2. Id를 저장할때 unordered_map을 사용하는 것이 효율적이다. O(1)로 바로 접근할 수 있기 때문이다.
  3. C++은 문자열을 split하는 함수가 따로 있지는 않다. 따라서 다른 곳에서 함수로 가져왔는데... 이를 반드시 정리해두어서 코딩테스트에 사용할 수 있도록 해야겠다.

코드

#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>
#include <utility>
using namespace std;
// 문자열을 split하는 방법, sstream을 사용한다.
vector<string> split(string input, char delimiter) {

    vector<string> answer;
    stringstream ss(input);
    string temp;
 
    while (getline(ss, temp, delimiter)) {
        answer.push_back(temp);
    }
 
    return answer;
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    // unordered_map으로 닉네임들을 정리한다.
    unordered_map<string, string> urd;
    // pair형 vector로 지금까지 오간 id들을 정리한다. 
    vector<pair<string, int> > roomSeq;
    
    for(int i=0; i<record.size(); i++){
        // split을 하여 해동, id, 닉네임 으로 나눈다.
        vector<string> tmp = split(record[i], ' ');
        
        // change가 아닐 경우이다. 
        if(tmp.size() == 3){
            // leave가 있다는것을 생각하지 못함.... 제대로 보고 하기
            // 해당 id가 존재할 경우 unordred_map에 적힌 닉네임을 바꿔주었다. 
            if(urd.count(tmp[1])){
                urd[tmp[1]] = tmp[2];
            } 
            else{
            // 해당 id가 없을 경우 새롭게 추가해주었다.
                urd.insert(make_pair(tmp[1], tmp[2]));
            
            }     
        }
        
        
        // Enter인지 Leave인지 구별해주는 변수
        int flag = 0;
        if(tmp[0] == "Enter") flag = 1;
        else if(tmp[0] == "Leave") flag = -1;
        // change일 경우 더 이상 필요가 없을 경우 패스한다. 
        else continue;
        
        roomSeq.push_back(make_pair(tmp[1], flag));
        
        
    }
    for(int i=0; i<roomSeq.size(); i++){
        string s;
        if(roomSeq[i].second == 1){
            s = urd[roomSeq[i].first] + "님이 들어왔습니다.";
        }
        else{
            s = urd[roomSeq[i].first] + "님이 나갔습니다.";
        }
        answer.push_back(s);
    }
    return answer;
}

소감

unordered_map과 vector를 같이 쓰면서 서로 비교해가는 문제가 흥미로웠다. 또한 c++에서 split하는 법을 꼭 알아두어야한다. unordered_map을 사용하는 매우 좋은 문제였으므로 잘 기억해서 복습하자.

profile
No Pain No Gain

0개의 댓글