[프로그래머스] 오픈채팅방

김개발·2021년 6월 21일
0

프로그래머스

목록 보기
30/42

문제 푼 날짜 : 2021-06-15

문제

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42888

접근 및 풀이

유저별 닉네임을 어떻게 관리하느냐가 중요하다고 생각했다.
아래의 문제에서 주어진 조건에 따르면, 닉네임을 변경할 수 있는 경우는 아래와 같다.

채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.
1. 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
2. 채팅방에서 닉네임을 변경한다.

그렇기 때문에, "Enter", "Change"일 경우에 유저별 닉네임에 대해서 최신화를 해줘야한다.
이를 위해 C++ STL 중의 map을 이용하였다.
"Enter", "Change"인 경우만 key를 유저 아이디, value를 닉네임으로 지정하여 마지막까지 업데이트를 하여 최신 유저 아이디별 닉네임 정보를 가질 수 있도록 하였다.
그 이후, "Enter", "Leave" 두 경우에 따라서 채팅방에 나타나는 메시지를 저장할 수 있도록 하였다.

코드

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

using namespace std;

vector<string> split(string input, char delimiter) {
    vector<string> answer;
    stringstream ss(input);
    string temp;
 
    while (getline(ss, temp, delimiter)) {
        answer.push_back(temp);
    }
    return answer;
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string, string> id_info;
    
    for (auto str : record) {
        vector<string> v = split(str, ' ');
        if (v[0] == "Enter") {
            id_info[v[1]] = v[2];
        } else if (v[0] == "Change") {
            id_info[v[1]] = v[2];
        }
    }
    for (auto str : record) {
        vector<string> v = split(str, ' ');
        if (v[0] == "Enter") {
            answer.push_back(id_info[v[1]] + "님이 들어왔습니다.");
        } else if (v[0] == "Leave") {
            answer.push_back(id_info[v[1]] + "님이 나갔습니다.");
        } else {
            continue;
        }
    }
    return answer;
}

결과

피드백

비교적 쉬운 문제여서 잘 해결할 수 있었다. 문자열을 파싱하는 방법과 C++ STL을 api를 보지 않고도 잘 사용할 수 있도록 익혀둬야 할 것 같고, 이와 관련된 문제를 더 많이 풀어봐야겠다.

profile
개발을 잘하고 싶은 사람

0개의 댓글