본문 바로가기
문제 풀이/프로그래머스 (Programmers)

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

by 희조당 2021. 9. 21.
728x90

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

 

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

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

programmers.co.kr


 문제 풀이

가장 중요한 것은 중간 과정이 필요가 없어 최종 로그만 보이면 된다는 것이다.

ID 자체는 중복이 되면 안 되니 맵을 사용 해 ID : 별명 정보를 저장하였고,

벡터에는 ID : 명령 을 저장해서 최종 로그의 명령을 저장한다. 

 

stringstream을 이용해서 string을 잘라준다.

tmp에는 명령어, id, 별명 순서로 저장되어 있다.

 

반복문을 통해서 명령어에 따라 맵과 벡터를 갱신한다.

명령어가 Enter라면 (id, 별명)을 맵에 갱신해주고 벡터에 (id, 명령)을 추가해준다.

Leave일 경우 따로 맵을 갱신할 필요는 없다. 단순히 벡터에 명령을 추가해준다.

그 외(Change)에는 별명만 다시 갱신해주면 된다.

 

반복문이 종료되었다면 처리 로그가 들어있는 벡터를 순회한다.

명령어가 Enter라면 벡터의 첫 번째 인수(ID)를 이용해

맵에 있는 value 값(nickname)을 가져와 뒤에 "님이 들어왔습니다." 추가하고 answer 벡터에 추가한다.

Leave라면 Enter와 동일하게 별명을 가져와 뒤에 "님이 나갔습니다."를 추가하고 answer 벡터에 추가해준다.

 느낀 점

처음에 구현했던 코드는 stringstream을 사용하지 않아서 되게 코드가 깔끔하지 않았다. 이번 공부를 통해서 stringstream을 정리하는 기회를 가지게 되었다. 

 코드

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

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string, string> m; // id : nickname 정보
    vector<pair<string, string>> v; // id : instruction 정보

    for (int i = 0; i < record.size();i++) {
        string tmp[3]; // instruction + id + nickname 
        string token;
        stringstream ss(record[i]);
        int idx = 0;
        while (ss >> token) {
            tmp[idx++] = token;
        }

        if (tmp[0] == "Enter") {
            m[tmp[1]] = tmp[2];
            v.push_back(make_pair(tmp[1], tmp[0]));
        }
        else if (tmp[0] == "Leave") {
            v.push_back(make_pair(tmp[1], tmp[0]));
        }
        else {
            m[tmp[1]] = tmp[2];
        }
    }

    for (auto i : v) {
        if (i.second == "Enter") {
            answer.push_back(m[i.first] + "님이 들어왔습니다.");
        }
        else if (i.second == "Leave") {
            answer.push_back(m[i.first] + "님이 나갔습니다.");
        }
    }

    return answer;
}

댓글