[C++로 풀이] 오픈채팅방 ⭐⭐
카테고리: Programmers
태그: Coding Test Algorithm
📌 오픈채팅방
난이도 ⭐⭐
🚀 문제
🚀 내 풀이 ⭕
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
string splitStr(string str, int number){
string word = "";
for(int i = 0; i < str.length(); i++){
if (str[i] == ' '){
number--;
if (number == 0)
break;
else
word = "";
}
else
word += str[i];
}
return word;
}
vector<string> solution(vector<string> record) {
vector<string> answer;
unordered_map<string, string> info; // (ID, nickname)
vector<pair<string, string>> command_vec; // (ID, command)
for(int i = 0; i < record.size(); i++) {
string command = splitStr(record[i], 1);
string id = splitStr(record[i], 2);
if (command != "Change")
command_vec.push_back(make_pair(id, command));
if (command != "Leave"){
string nickName = splitStr(record[i], 3);
info[id] = nickName;
}
}
for(int i = 0; i < command_vec.size(); i++)
{
string nickName = info[command_vec[i].first];
if (command_vec[i].second == "Enter")
answer.push_back(nickName + "님이 들어왔습니다.");
else if (command_vec[i].second == "Leave")
answer.push_back(nickName + "님이 나갔습니다.");
}
return answer;
}
- splitStr 함수는 공백을 기준으로 하여 단어를 리턴하는 함수로 만들었다.
- 두 번째 인수인
number
가- 1 이면 첫 번째 단어를 리턴하게끔 👉 “Enter”, “Leave”, “Change”
- 2 이면 두 번째 단어를 리턴하게끔 👉 아이디
- 3 이면 세 번째 단어를 리턴하게끔 👉 닉네임
- 두 번째 인수인
- 첫 번째 for문
- 추후 기록을 위해 첫 번째 단어인 명령어(“Enter”, “Leave”)를
command_vec
에 아이디와 함께 저장한다. (단, “Change”는 제외. “Change”는 기록에 남지 않는다.) - 닉네임 변경을 알 수 있을 때는 “Enter”(채팅방 나간 후 닉변했다면 닉네임 달라져서 들어올 것), “Change”(채팅방 내에서 닉변)일 때다.
info
에 Key를 ID로, Value를 닉네임으로 기록한다.- 닉네임이 변경되더라도 info[id] = nickName 이 과정 하나로 수정 되므로 이 문장 하나로 추가, 수정, 변경 안됐는데 또 덮어쓰기가 됨.
- 추후 기록을 위해 첫 번째 단어인 명령어(“Enter”, “Leave”)를
- 두 번째 for문
- 닉네임 + 명령어 형태로 출력하기!
- 닉네임은 info[command_vec[i].first 아이디 Key로 가져오면 되고 명령어는 command_vec[i].second
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기