Min:D's Devlog

[프로그래머스][2019 KAKAO BLIND][C++] 오픈채팅방 본문

알고리즘/프로그래머스

[프로그래머스][2019 KAKAO BLIND][C++] 오픈채팅방

Min:D 2020. 9. 12. 12:00

문제

프로그래머스 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방 (Level 2)

 

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

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

programmers.co.kr

 


문제 풀이

접근 방식

이 문제는 2019 카카오 블라인드 채용 1차 코딩테스트 1번 문제로,

주어진 채팅방 기록을 통해 최종적으로 보여지는 메시지를 구하는 문제였다.

이 문제는 map을 이용하면 간단하게 해결할 수 있었다.

 

우선, key 값에는 ID, value에는 닉네임을 저장할 map을 만들어주었다.

그 후, record 문자열을 옵션, ID, 닉네임으로 파싱한 후, 옵션에 따라 다르게 처리해주었다.

 

옵션이 Enter인 경우에는 map에 ID와 닉네임을 저장해주었고, id와 메시지를 저장해주었다.

옵션이 Leave인 경우에는 id와 메시지를 저장해주었고,

Change인 경우에는 map에 ID와 닉네임을 다시 저장하여 닉네임을 변경해주었다.

 

마지막으로  저장해 놓은 id와 메시지를 활용하여 답을 도출하였다.


풀이 코드 - C++

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

using namespace std;

vector<string> solution(vector<string> record) {
    map<string, string> dic; // ID, 닉네임
    vector<string> result_id; // ID
    vector<string> result_op; // 옵션
    int len = record.size();
    for(int i = 0 ; i < len ; i++){
        // 옵션
        int start= 0;
        int end = record[i].find(" ", start);
        string option = record[i].substr(start, end);
        
        // ID
        start = end + 1;
        end = record[i].find(" ", start);
        string id = record[i].substr(start, end-start);
        
        // 닉네임
        string nick = record[i].substr(end+1);
        
        if(option == "Enter"){
            dic[id] = nick;
            result_id.push_back(id);
            result_op.push_back("님이 들어왔습니다.");
        } else if(option == "Leave"){
            result_id.push_back(id);
            result_op.push_back("님이 나갔습니다.");
        } else {
            dic[id] = nick;
        }
    }
    int result_len = result_id.size();
    vector<string> answer(result_len);
    for(int i = 0; i < result_len; i++){
        answer[i] = dic[result_id[i]] + result_op[i];
    }
    return answer;
}

실행 결과

실행 결과 : 100.0

Comments