오픈채팅방
제한사항
- record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
- 다음은 record에 담긴 문자열에 대한 설명이다.
- 모든 유저는 [유저 아이디]로 구분한다.
- [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
- [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
- [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
- 첫 단어는 Enter, Leave, Change 중 하나이다.
- 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져 있다.
- 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
- 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
- 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못된 입력은 주어지지 않는다.
입출력 예
record result
["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] | ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."] |
입출력 예 설명
입출력 예 #1
문제의 설명과 같다.
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
vector<string> split(string sentence, char Separator)
{
vector<string> answer;
stringstream ss(sentence);
string tmp;
while (getline(ss, tmp, Separator)) {
answer.push_back(tmp);
}
return answer;
}
vector<string> solution(vector<string> record) {
vector<string> answer;
vector<string> alert; //들어왔습니다, 나갔습니다.
map<string,string> uid_name;
for(int i=0; i<record.size(); i++)
{
vector<string> tmp = split(record[i], ' ');
if(tmp[0] == "Enter")
{
alert.push_back("님이 들어왔습니다.");
uid_name[tmp[1]] =tmp[2];
answer.push_back(tmp[1]);
}
else if(tmp[0] == "Leave")
{
alert.push_back("님이 나갔습니다.");
answer.push_back(tmp[1]);
}
else // 이름 변경한 경우
{
uid_name[tmp[1]]=tmp[2];
}
}
for(int i=0; i<answer.size(); i++)
{
answer[i] = uid_name[answer[i]] + alert[i];
}
return answer;
}
=> map을 사용해 유일 키인 uid 값에 따른 name을 변경하면서 출입유무를 기록하면 됩니다.
=> alert : 현 상황에서 어떠한 자가 들어가고 나갔고를 저장합니다.
=> uid_name : 유일키인 uid 값을 key로 가지고 name이라는 value를 가지는 <string, string> 형 MAP 자료형입니다.
=> JAVA와 PYTHON의 경우 split 함수를 지원하지만 C++의 경우 지원하지 않습니다. 그러므로 split 함수를 자체 생성하여 사용하여야 합니다.
https://codingham.tistory.com/247
string split 하는법 C++ | sstream 사용법 C++ | find함수 substr함수
#include #include #include using namespace std; int main() { stringstream ss; string tmp; ss.str("Hello new World of Sstream!!!"); ss << "Start" <<"......."; while(ss >> tmp) cout << tmp << " "; cou..
codingham.tistory.com
=> 위의 함수를 통해 vector <string> record를 나눴습니다.
=> for문을 통해 tmp [0]의 값에 따라 alert와 uid_name에 들어갈 값을 적절히 조정해주었습니다.
=> string의 경우 값이 있다고 하더라고 = 를 통해 후위에 오는 연산식을 통해 해당 구역을 재지정해줄 수 있습니다.