본문 바로가기

code/programmers

[프로그래머스] 2019 카카오 블라인드(2018 시행) 1번 오픈채팅방

문제 링크:

 

코딩테스트 연습 - 오픈채팅방 | 프로그래머스

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅

programmers.co.kr

해설 링크:

 

2019 카카오 신입 공채 1차 코딩 테스트 문제 해설

작년에 이어 올해도 블라인드 전형으로 카카오 개발 신입 공채가 시작되었습니다! 그 첫 번째 관문으로 1차 온라인 코딩 테스트가 지난 9월 15일(토) 오후 2시부터 7시까지 5시간 동안 치러졌는데요. 지원자분들 만큼이나 준비위원들도 테스트가 문제없이, 공정하게 치러질 수 있도록 많은 준비를 했고 두근 거리는 마음으로 끝까지 온라인 테스트를 모니터링했답니다. 문제는 작년과 비슷하게 구현 문제 위주로 쉬운 난이도에서 어려운 […]

tech.kakao.com

코드:

/* 1. 유저 아이디 형식이 uidXXXX꼴이라고 생각해버리고 XXXX를 정수로 받아버림... */

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

using namespace std;

vector<string> solution(vector<string> record) {
    vector<pair<bool, string>> cmd_uid;
	unordered_map<string, string> uid_nck;
	for (int i = record.size() - 1; i >= 0; --i) {
        string uid;
		int j = (record[i][0] == 'C') + 6;
		if (record[i][0] == 'L') 
			for (; j < record[i].size(); ++j)
				uid.push_back(record[i][j]);
		else
			for (; record[i][j] != ' '; ++j)
				uid.push_back(record[i][j]);

		if (uid_nck.find(uid) == uid_nck.end() && j < record[i].size()) {
			string nck;
			for (++j; j < record[i].size(); ++j)
				nck += record[i][j];
			uid_nck[uid] = nck;
		}
		if (record[i][0] != 'C')
			cmd_uid.emplace_back(record[i][0] == 'E', uid);
	}

	vector<string> answer;
	for (auto it = cmd_uid.rbegin(); it != cmd_uid.rend(); ++it){
		if((*it).first) 
            answer.push_back(uid_nck[(*it).second] + "님이 들어왔습니다.");
		else
            answer.push_back(uid_nck[(*it).second] + "님이 나갔습니다.");
	}

    return answer;
}