post image post image post image post image post image post image post image post image

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

 

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

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

programmers.co.kr

2019 카카오 1번 문제.

문자열 파싱 + map 자료구조를 활용할 줄 아는지를 묻는 문제이다.

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

void parsing(string& s, int& n_cmd, string& id, string& nick) {
	int idx = 0, flag = 0;
	string cmd = "";
	while (idx < s.length()) {
		while (idx < s.length() && s[idx] != ' ') {
			if (flag == 0) cmd += s[idx];
			else if (flag == 1) id += s[idx];
			else if (flag == 2 && n_cmd < 2) nick += s[idx];
			idx++;
		}
		if (flag == 0) {
			if (!cmd.compare("Change")) n_cmd = 1;
			else if (!cmd.compare("Leave")) n_cmd = 2;
		}
		flag++;
		idx++;
	}
}

vector<string> solution(vector<string> record) {
	vector<string> ans;
	vector<pair<int, string>> pre_ans; // cmd, id // cmd 0-> enter, 1-> change, 2-> leave
	unordered_map<string, string> id_to_nick;
	int cmd = 0;
	string id = "", nick = "", tmp = "";

	for (int i = 0; i < record.size(); i++) {
		parsing(record[i], cmd, id, nick);
		//enter, change -> id_to_nick update
		if (cmd < 2) id_to_nick[id] = nick;
		//enter, leave -> to pre_ans
		if (cmd != 1) pre_ans.emplace_back(cmd, id);
		cmd = 0, id = "", nick = "";
	}
	for (int i = 0; i < pre_ans.size(); i++) {
		//enter
		if (pre_ans[i].first == 0) tmp = id_to_nick[pre_ans[i].second] + "님이 들어왔습니다.";
		//leave
		else tmp = id_to_nick[pre_ans[i].second] + "님이 나갔습니다.";
		ans.push_back(tmp);
	}
	//for (string s : ans) cout << s << '\n';
	return ans;
}

int main() {
	int n;
	vector<string> record;
	string tmp;

	cin >> n;
	cin.ignore();
	while (n--) {
		getline(cin, tmp);
		record.push_back(tmp);
	}
	solution(record);
	return 0;
}

+ Recent posts