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;
}
'컴퓨터 사이언스 > 1고리즘' 카테고리의 다른 글
백준 6591 : 이항 쇼다운 (0) | 2021.03.02 |
---|---|
2019 KAKAO BLIND RECRUITMENT - 2. 실패율 (0) | 2021.01.06 |
2020 KAKAO BLIND RECRUITMENT - 3. 자물쇠와 열쇠 (0) | 2021.01.05 |
2020 KAKAO BLIND RECRUITMENT - 2. 괄호 변환 (0) | 2021.01.05 |
2020 KAKAO BLIND RECRUITMENT - 1. 문자열 압축 (0) | 2021.01.05 |