본문으로 바로가기

오픈채팅방(Level 2)

문제

전체 문제 보기

 

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

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

programmers.co.kr

접근법

이번 문제는 주어진 문자열 배열(record)을 공백을 기준으로 분할한 뒤 해시 테이블에 id, name으로 등록한 후 출력하여 풀 수 있습니다. 분할할 문자열의 기준이 공백이라면 stringstream 라이브러리로 쉽게 분할 가능합니다. 따라서 다음과 같이 문제를 해결할 수 있습니다.

  • stringstream을 활용하여 입력받은 명령어 문장을 3개의 문자열(command, id, name)로 나눕니다.
    • command가 "Enter` 일 경우
      • idTableid, name을 새로 등록합니다.
      • log 기록을 남깁니다. {id, "님이 들어왔습니다."}
    • command가 "Change" 일 경우
      • idTableid, name을 다시 등록합니다.
    • 'command`가 "Leave" 일 경우
      • log 기록을 남깁니다. {id, "님이 나갔습니다."}
  • log 기록들의 ididTable을 참조하여 name으로 변경 후 answer 배열에 저장합니다.

전체 코드

#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>

using namespace std;
using Table = unordered_map<string, string>;

void ProcessRecord(const string& command, const string& id, const string& name, Table& idTable, vector<vector<string>>& log)
{
    if(command[0] == 'E'){ //입장
        idTable[id] = name; 
        log.push_back({id, "님이 들어왔습니다."});
    }
    else if(command[0] == 'C') // 닉네임 변경
        idTable[id] = name; 
    else // 퇴장
        log.push_back({id, "님이 나갔습니다."});
}
vector<string> solution(vector<string> record) {
    vector<string> answer;
    Table idTable;
    vector<vector<string>> log;

    for(const auto& row : record)
    {
        stringstream ss(row);
        string command, id, name;

        ss >> command;
        ss >> id;
        if(command[0] != 'L')
            ss >> name; 

        ProcessRecord(command, id, name, idTable, log);
    }

    for(const auto& row : log)
    {
        answer.emplace_back(idTable[row[0]] + row[1]);
    }
    return answer;
}

실행 결과