[문제보기]

 2019_KAKAO_BLIND 오픈채팅방

 

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

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

programmers.co.kr

 

[풀이과정]

이 문제에서 입력값을 내가 원하는 대로 나눠주기 위해 strtok() 함수를 만들어 vector temp에 저장해주었다.(strtok() 함수는 방금 그 곡 문제의 -추가- 부분을 참고)

그리고 map을 사용하여 <유저 아이디, 닉네임>으로 key, value를 잡고 문제를 풀어나갔다. 

 

"Enter"

vector info에 데이터를 저장 및 map m에 데이터가 있으면 수정, 없으면 삽입

 

"Leave"

vector info에 데이터 저장

 

"Change"

map m의 데이터 수정

[소스코드]

#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;

typedef struct _INFO{
    string behavior;
    string uid;
} INFO;


vector<string> strtok(string str, char delim=' '){
    vector<string> ret;
    
    int prev = 0;
    for(int i=0; i<str.size(); i++){
        if(str[i] == delim){
            ret.push_back(str.substr(prev, i-prev));
            prev = i+1;
        }
    }
    
    if(prev != str.size())
        ret.push_back(str.substr(prev, str.size()-prev));
    
    return ret;
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    
    vector<INFO> info;
    map<string, string> m;
    for(int i=0; i<record.size(); i++){
        vector<string> temp = strtok(record[i]);

        if(temp[0] == "Enter"){
            info.push_back({temp[0], temp[1]});
            m[temp[1]] = temp[2];
        }
        else if(temp[0] == "Leave"){
            info.push_back({temp[0], temp[1]});
        }
        else{
            m[temp[1]] = temp[2];
        }
    }
    
    for(int i=0; i<info.size(); i++){
        string s;

        if(info[i].behavior == "Enter"){
            s = m[info[i].uid] + "님이 들어왔습니다.";
        }
        else{
            s = m[info[i].uid] + "님이 나갔습니다.";
        }

        answer.emplace_back(s);
    }

    return answer;
}

 

[해결 과정 중 실수한 부분]

맨 처음에 문제를 풀 때는 struct를 이용하여 자료형을 만들고 동작을 저장하는 vector, 닉네임을 저장하는 vector 2개를 사용하였다. 그리고 출력하는 부분에서 for문을 사용하여 닉네임을 저장하는 vector에 uid를 검사하고 일치하는 

닉네임을 출력하였다. 하지만 이 부분에서 출력을 할 때마다 for문을 통해 검사를 해주어야 되서 테스트케이스 24번

이후에는 시간초과가 나왔다. 

 

그래서 블로그를 참고하여 map을 사용하여 key, value를 통해 O(1) 시간으로 출력하게 만들었다.

 

https://hwan-shell.tistory.com/171