cosmohoo 2021. 12. 9. 20:42
반응형

문제 설명1

 

 

문제 설명2

 

 

 

제한사항

  • 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의 경우 값이 있다고 하더라고  = 를 통해 후위에 오는 연산식을 통해 해당 구역을 재지정해줄 수 있습니다. 

 

반응형