오답노트

프로그래머스 2단계 - 오픈채팅방 본문

C,C++/코딩테스트

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

권멋져 2022. 6. 3. 19:30
https://programmers.co.kr/learn/courses/30/lessons/42888
 

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

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

programmers.co.kr

- 문제 파악

오픈 채팅방은 사용자가 들어오거나 나가면 화면에 메세지를 띄운다. 이 메세지에는 사용자의 닉네임이 출력된다. 오픈채팅방은 사용자들끼리 중복된 닉네임을 사용할 수 있다. 사용자가 닉네임을 바꿀 수 있는 조건은 한번 들어온 뒤 나갔다가 다른 닉네임으로 재접속할때, 또는 채팅방 내에서 닉네임을 바꾸는 경우 밖에 없다. 오픈채팅방에서 일어난 이벤트가 담긴 배열을 입력 받을 때, 오픈채팅방을 생성한 사용자가 보는 메세지를 출력하라.

 

- 정답

원래는 map으로 풀 생각을 했으나, 일단 vector<pair<string,string>>으로 접근해서 풀었다. 하지만 정답률도 낮고 시간초과도 발생했다. 반복문을 무조건 두번 돌아야 하니 시간복잡도가 자연스럽게 높아진거 같다.

 

그래서 map으로 풀었더니 됐다...

map 메소드를 따로 외우지 않아서 일부러 vector로 접근했는데, 이번 기회에 map메소드를 익혀보자.

 

#include "bits/stdc++.h"

using namespace std;

vector<string> seperate(string str)
{
    vector<string> vec;
    int start_pos = 0;
    int space_pos = str.find(" ");

    while (space_pos > 0)
    {
        vec.push_back(str.substr(start_pos, space_pos - start_pos));
        start_pos = space_pos + 1;
        space_pos = str.find(" ", start_pos);
    }

    vec.push_back(str.substr(start_pos, str.size() - start_pos));

    return vec;
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    
    //vector<pair<string,string>> userid; //아이디, 닉네임
    map<string,string> userid; // 아이디 닉네임
    
    for(auto rcd : record)
    {
        vector<string> vec = seperate(rcd);
        
        if(vec[0] == "Enter")
        {
            answer.push_back(vec[1] + "님이 들어왔습니다.");

            if(userid.find(vec[1]) != userid.end())
            {
                userid.erase(vec[1]);
                userid.insert({vec[1],vec[2]});
            }
            else
                userid.insert({vec[1],vec[2]});
            
            
        }
        else if(vec[0] == "Leave")
        {
            answer.push_back(vec[1] + "님이 나갔습니다.");
        }
        else if(vec[0] == "Change")
        {
            if(userid.find(vec[1]) != userid.end())
            {
                userid.erase(vec[1]);
                userid.insert({vec[1],vec[2]});
            }
            else
                userid.insert({vec[1],vec[2]});
            
        }
            
    }
    
    for(int i = 0 ; i < answer.size() ; i++)
    {       
        int ntmp = answer[i].find("님");

        if(ntmp > -1)
        {
            string str_id = answer[i].substr(0, ntmp);
            auto str_name = userid.find(str_id);
            answer[i].replace(0, str_id.size(), str_name->second);
        }
    }

    return answer;
}