본문 바로가기
전공공부/코딩테스트

(c++) 프로그래머스 오픈채팅방

by 시아나 2022. 1. 4.

문제

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

 

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

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

programmers.co.kr


나의 풀이

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

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    string subRecord[200000][3];
    unordered_map<string, string> users;
    for (int i = 0; i < record.size(); i++) {
        string tmp;
        istringstream ss(record[i]);
        for (int k = 0; getline(ss, tmp, ' '); k++) {
            subRecord[i][k] = tmp;
        }
        if (subRecord[i][0].compare("Leave") != 0) {
            users[subRecord[i][1]] = subRecord[i][2];
        }
    }
    for (int i = 0; i < record.size(); i++) {
        string insert = "";
        if (subRecord[i][0].compare("Change") == 0) {
            continue;
        }
        insert += users.find(subRecord[i][1])->second;
        if (subRecord[i][0].compare("Enter") == 0) {
            insert += "님이 들어왔습니다.";
        }
        else if (subRecord[i][0].compare("Leave") == 0) {
            insert += "님이 나갔습니다.";
        }
        answer.push_back(insert);
    }
    return answer;
}

처음 for문을 돌때 공백을 기준으로 문자열을 잘라서 배열에 넣어둔다.

istringstream ss(record[i]);
for (int k = 0; getline(ss, tmp, ' '); k++) {
	subRecord[i][k] = tmp;
}

 

그리고 아이디별로 가장 마지막 닉네임을 저장하기 위해 닉네임이 바뀔때마다 users라는 map의 닉네임을 변경한다.

코드에서는 Leave일때는 닉네임이 변경되지 않으므로 Leave가 아닐경우를 조건문으로 넣었다.

 

if (subRecord[i][0].compare("Leave") != 0) {
	users[subRecord[i][1]] = subRecord[i][2];
}

 

그 이후에는 처음 나온 명령어에 맞는 문자열을 넣어줬다.

    for (int i = 0; i < record.size(); i++) {
        string insert = "";
        if (subRecord[i][0].compare("Change") == 0) {
            continue;
        }
        insert += users.find(subRecord[i][1])->second;
        if (subRecord[i][0].compare("Enter") == 0) {
            insert += "님이 들어왔습니다.";
        }
        else if (subRecord[i][0].compare("Leave") == 0) {
            insert += "님이 나갔습니다.";
        }
        answer.push_back(insert);
    }