본문 바로가기
  • 실행력이 모든걸 결정한다
Algorithm/기타 알고리즘

[시뮬레이션] 오픈채팅장 - 2019 카카오 블라인드 채용

by 김코더 김주역 2022. 3. 5.
반응형

해결 방법

문제를 보면, 유저가 중간에 닉네임을 변경했을 경우에도 이전에 기록했던 닉네임들까지 변경된 닉네임으로 바뀐다고 한다.

즉, 유저별 마지막 닉네임이 가장 중요하다.

 

유저의 닉네임이 바뀌는 경우는 Enter과 Change이므로, 이 경우에만 유저의 닉네임을 업데이트 해주면 된다.

유저별 마지막 닉네임을 확정지었다면, 유저의 마지막 닉네임이 반영된 로그를 출력해주기만 하면 된다.

 

 

소스 코드

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

map<string, string> m;
vector<string> log[100001];
vector<int> space;
string str, action, uid;


vector<string> solution(vector<string> record) {
	vector<string> answer;
	for (int i=0;i<record.size();i++) {
		// 문자열을 상태, uid, 닉네임으로 분리
		str = record[i];
		for (int j=0;j<str.length();j++) if(str[j]==' ') space.push_back(j);
		log[i].push_back(str.substr(0, space[0]));
		if(log[i][0]=="Leave") log[i].push_back(str.substr(space[0]+1)); // Leave의 경우에는 상태, uid로만 분리
		else {
			log[i].push_back(str.substr(space[0]+1,space[1]-(space[0]+1)));
			log[i].push_back(str.substr(space[1]+1));
		}
		space.clear();
        
		// 유저의 닉네임을 바로바로 업데이트
		action=log[i][0]; uid=log[i][1];
		if(action=="Enter" || action=="Change") m[uid]=log[i][2];
	}
    
	for (int i=0;i<record.size();i++) {
		action=log[i][0]; uid=log[i][1];
		if(action=="Enter") {
			answer.push_back(m[uid]+"님이 들어왔습니다.");
		}
		if(action=="Leave") {
			answer.push_back(m[uid]+"님이 나갔습니다.");
		}
	}
	return answer;
}

 

테스트케이스 32개 모두 정답

 

반응형

댓글