[프로그래머스 42888] 오픈채팅방(2019 카카오 블라인드 채용)

[프로그래머스 42888] 오픈채팅방(2019 카카오 블라인드 채용)

- 2 mins

ViewCount


CATEGORY : 문자열 처리, 해싱

DIFFICULTY : LEVEL 2

LANGUAGE : C++

LINK : PROGRAMMERS 오픈채팅방

Comment

처음에 map 라이브러리를 사용하였지만unordered_map을 사용하여 시간복잡도를 줄였다. 또 “Enter”, “Leave”, “Change”와 같은 문자열을 그대로 비교하는 것이 아니라 앞글자만 비교하여 시간 소모를 더 줄였다.

map과 unordered_map의 차이에 대한 설명은 여기로

map으로의 저장은 ‘입장’과 ‘변경’일 때만 일어나고, answer로의 저장은 ‘입장’, ‘퇴장’일 때만 일어나는 것을 알 수 있다.

Python으로 짜면 훨씬 짧다.


#include<iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;

void Tokenize(const string& s, vector<string>& tok) {
	string pt = "";
	for (char c : s) {
		if (c != ' ') {
			pt += c;
		}else {
			tok.push_back(pt);
			pt.clear();
		}
	}
	tok.push_back(pt);
}
vector<string> solution(vector<string> record) {
	vector<string> answer;
	unordered_map<string, string> mp;
	vector<string> tok;
	// 1. 맵 업데이트
	for (string s : record) {
		Tokenize(s, tok);
		if (tok[0][0] == 'E') {
			mp[tok[1]] = tok[2];
			answer.push_back(tok[1]);
		}
		else if (tok[0][0] == 'C') {
			mp[tok[1]] = tok[2];
		}
		else {
			answer.push_back(tok[1]);
		}
		tok.clear();
	}
	// 2. 문자열 형식에 맞게 answer 갱신
	int i = 0;
	for (string s : record) {
		if (s[0] == 'E') {
			answer[i] = mp[answer[i]] + "님이 들어왔습니다.";
			i++;
		}
		else if (s[0] == 'L') {
			answer[i] = mp[answer[i]] + "님이 나갔습니다.";
			i++;
		}
	}
	return answer;
}
comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora