[Programmers] 오픈채팅방

김민석·2021년 10월 6일
0

프로그래머스

목록 보기
20/30

아이디에 따른 닉네임 정보를 유지하는 문제이다.

문제해결 전략
아이디는 고유하기 때문에 아이디에 따른 닉네임 정보를 저장하면 된다.

이 과정을 쉽게 하기 위해 map 자료구조를 이용하였다.

map에 키값으로 아이디를 value 값으로 닉네임을 저장한다.

그리고 반환을 위해 명령어와 아이디만 저장하고, 반환할 때는 저장된 아이디를 기반으로 map에서 값을 찾아내면 된다.

명령어에 따른 기능

  • 입장
    map에 아이디가 존재하면 닉네임 변경 -> 채팅방 나가서 변경한 경우
    아이디가 존재하지 않으면 닉네임 추가
  • 닉네임 변경
    닉네임 변경 -> 채팅방 내부에서 변경한 경우
  • 퇴장
    변화 x

코드

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

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string, string> m; // 아이디, 닉네임
    vector<pair<string,string>> v; // 명령어, 아이디
    for(int i=0;i<record.size();i++){
        string abc[3];
        string tmp = "";
        int flag = 0;
        for(int j=0;j<record[i].size();j++){
            if(record[i][j] == ' '){
                abc[flag] = tmp;
                tmp = "";
                flag++;
            }else
                tmp += record[i][j];
        }
        abc[flag] = tmp;
        
        if(abc[0] == "Enter"){
            v.push_back(make_pair("들어왔습니다.",abc[1]));
            if(m.find(abc[1]) == m.end()){
                m.insert(make_pair(abc[1],abc[2]));
            }else{
                m[abc[1]] = abc[2];
            }
        }else if(abc[0] == "Change"){
            m[abc[1]] = abc[2];
        }else{
            v.push_back(make_pair("나갔습니다.",abc[1]));
        }
    }
    
    for(int i=0;i<v.size();i++){
        string str = "";
        str += m[(v[i].second)];
        str += "님이 ";
        str += v[i].first;
        answer.push_back(str);
    }
    return answer;
}

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

profile
김민석의 학습 정리 블로그

0개의 댓글