https://programmers.co.kr/learn/courses/30/lessons/42888

 

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

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

programmers.co.kr

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

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string,string>chattingNickName;
    string tmpanswer="";
    string addAnswer="";
    vector<string>vtmpAnswer;
   
    for( vector<string>::iterator it = record.begin() ; it != record.end(); ++it)
    {
        //Enter=입장합니다.
        //Leave =떠납니다.
        //Change= 변경
        
        //채팅방에 입장
        //채팅방에서닉넴 변경 
        //채팅방 나가기
        size_t pos = 0;
        int count =1;
        string token;
        string delimiter = " ";
        bool bChange=false;

        string key="";
        
        while ((pos = (*it).find(delimiter)) != string::npos) 
        {
            token = (*it).substr(0, pos);

            if(count==1)
            {
                if(token.compare("Leave")==0)
                {
                   
                     tmpanswer="나갔습니다.";
                     (*it).erase(0, pos + delimiter.length());
                     pos = (*it).find(delimiter);
                     token = (*it).substr(0, pos);
                     
                }
                else if(token.compare("Enter")==0)
                {
                      addAnswer=token+" "+tmpanswer;
                      tmpanswer="들어왔습니다.";
                } 
                else if(token.compare("Change")==0)
                {
                      tmpanswer="변경됬습니다.";
                      bChange=true;
                } 
            }
            
            if(count==2)
            {
                key=token;
                if(bChange==false)
                {
                   vtmpAnswer.push_back(token+" "+tmpanswer);
                }
                else
                {
                    bChange=false;
                }
           
            }

            (*it).erase(0, pos + delimiter.length());
            count++;
        }
        if(count==2)
        {
            vtmpAnswer.push_back(token+" "+tmpanswer);
        }
        
        if(count==3)
        {
            chattingNickName[key]=(*it);
        }
    }
    
    for( vector<string>::iterator it = vtmpAnswer.begin() ; it != vtmpAnswer.end(); ++it)
    {
         size_t pos = 0;
         string token;
         string delimiter = " ";
        
        while ((pos = (*it).find(delimiter)) != string::npos) 
         {
            pos = (*it).find(delimiter);
            token = (*it).substr(0, pos);
            (*it).erase(0, pos + delimiter.length());
            answer.push_back(chattingNickName[token]+"님이"+" "+(*it));
        }
    }
    return answer;
}

간단히 설명자하면 map을 이용해서 풀었습니다.

input

["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]

output

["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]

닉넴은 중복 될수 잇지만 uid가(유저 아이디) 고유번호입니다. 

고유번호면 키값이 될수 있다는걸 인지해야합니다.

그래서 uid로 최종적인 nickname을 미리 저장해둔뒤에 

enter, leave, change행동들 한글로 변경해줍니다.

그리고나서 uid를 비교해서 그대로 최종 닉네임으로 변경해줍니다! 

 map을 잘 이해하고 있다면 쉽게 해결할 수 있었던 문제였습니다.

 

아마 더 간단하게 푸실수잇는분도 있을거고 저도 좀더 좋은방법이 있나 찾아봐야할것같아요

'알고리즘 공부' 카테고리의 다른 글

전광판  (0) 2023.03.02
회의실 예약  (0) 2023.03.02
<UnionFind> 경로 연결 문제  (0) 2021.05.20
for문으로 메모라이제이션 피보나치 수열  (0) 2021.05.15
중복되지 않는 첫번째 알파뱃 찾기  (0) 2020.12.10

+ Recent posts