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

Byungwoong An·2021년 7월 1일
0

문제


풀이전략

  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개의 댓글