mojo's Blog

오픈채팅방 본문

프로그래머스/Level 2

오픈채팅방

_mojo_ 2021. 9. 7. 15:17

문제 링크 => 코딩테스트 연습 - 오픈채팅방 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr


STL Map 을 이용하여 간단하게 해결할 수 있는 문제이다.

 

3가지 Query 가 주어진다.

 

먼저 Enter, Change Query 를 살펴보면 특정 uid 값이 들어올 때 해당 uid 에 대한 이름을 저장할 수 있도록 해줘야 한다.

 

즉, Map STL 을 이용하여 map<string, string> m; 이라고 할 때, m[ uid ] = name 으로 저장이 가능하다.

 

이때 Map 을 사용할 수 있는 이유는 uid, name 문자열의 길이가 최대 10 이기 때문에 사용해도 문제는 없어보인다.

 

만약에 문자열 길이가 크다면?

=> Hash 를 사용하여 uid를 해싱한 값 hashValue 와 name 을 묶어줘야 한다. 

 

uid 에 대한 name 을 모두 저장하였다면 Enter, Leave Query 에 대해 다음과 같이 벡터 answer 에 push 하면된다.

 

Enter => m[uid] + "님이 들어왔습니다."

Leave => m[uid] + "님이 나갔습니다."

 

풀이 Code

 

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

using namespace std;

string query[100000][3];
int querySize;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    querySize = record.size();
    
    for(int i=0; i<record.size(); i++){
        string s = "";
        int idx = 0;
        for(int j=0; j<record[i].size(); j++){
            if(record[i][j] != ' ') s += record[i][j];
            else{ 
                query[i][idx++] = s;
                s = "";
            }
        }
        query[i][idx] = s;
    }
    
    map<string, string> m;
    for(int i=0; i<querySize; i++){
        if(query[i][0] == "Enter" || query[i][0] == "Change"){
            m[query[i][1]] = query[i][2];
        }
    }
    
    for(int i=0; i<querySize; i++){
        if(query[i][0] == "Enter"){
            answer.push_back(m[query[i][1]]+"님이 들어왔습니다.");
        }
        else if(query[i][0] == "Leave"){
            answer.push_back(m[query[i][1]]+"님이 나갔습니다.");
        }
    }
    
    return answer;
}

 

'프로그래머스 > Level 2' 카테고리의 다른 글

구명보트  (0) 2021.09.10
H-Index  (0) 2021.09.07
위장  (0) 2021.09.07
124 나라의 숫자  (0) 2021.09.07
소수 찾기  (0) 2021.09.06
Comments