기록공간

오픈채팅방 (프로그래머스) 본문

Algorithm/문제

오픈채팅방 (프로그래머스)

입코딩 2020. 8. 19. 15:52
반응형

해결 방법

우선 record에 들어있는 문자열 형태의 원소를 행위, ID, 닉네임 이 세가지로 쪼개줘야 한다. 이때 sstream을 사용하면 편하게 쪼개줄 수 있다.

  

닉네임은 중복이 되어도 상관없고 ID를 기준으로 구분한다. 때문에 해쉬 테이블 특성을 이용하여 key값으로 id를 사용한다.

 

해쉬 테이블의 value값은 구조체로 string 타입의 닉네임과 들어왔는지 나갔는지를 검사하는 bool 타입 멤버변수를 가지고 있다.

(나간 id는 닉네임 변경이 불가능하기 때문에 들어왔는지 나갔는지를 검사하는 bool값이 필요하다)

 

찾은 id값이 Enter하는 경우 해쉬 테이블의 특성을 이용하여 그 id를 key값으로 하는 value 구조체에 닉네임을 부여하고 들어왔다는 체크를 한다. 

 

이제 최종적인 닉네임 변경 적용이 완료되었고 이를 바탕으로 Enter 했는지, Leave 했는지 행동에 따라서 상태 메시지를 출력해주면 된다. 

 

구현 코드는 다음과 같다.

#include <string>
#include <unordered_map>
#include <vector>
#include <sstream>
using namespace std;

enum type {DO = 0, ID, NICK, TYPE_END};

struct info {
    string nickName;
    bool isOn;
};

vector<string> solution(vector<string> record) {
    vector<string> answer;
    unordered_map<string, info> um;
    string process[TYPE_END];
    
    for(const auto iter : record) {
        int i = 0;
        
        stringstream ss(iter);
        while(ss >> process[i++]);
        
        if(process[DO] == "Enter") {
            um[process[ID]].isOn = true;
            um[process[ID]].nickName = process[NICK];
        }
        
        if(process[DO] == "Leave") 
            um[process[ID]].isOn = false;
        
        if(process[DO] == "Change" &&  um[process[ID]].isOn)
            um[process[ID]].nickName = process[NICK];
    }
    
    
     for(const auto iter : record) {
        int i = 0;
        
        stringstream ss(iter);
        while(ss >> process[i++]);
        
        string message = "";
         
        if(process[DO] == "Enter") 
            message =  um[process[ID]].nickName + "님이 들어왔습니다.";
            
        if(process[DO] == "Leave") 
            message =  um[process[ID]].nickName + "님이 나갔습니다.";
         
         if(message.size() > 0) 
             answer.push_back(message);
     }
    
    return answer;
}

 

반응형
Comments