ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오픈채팅방
    프로그래머스(Programmers) 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의 경우 값이 있다고 하더라고  = 를 통해 후위에 오는 연산식을 통해 해당 구역을 재지정해줄 수 있습니다. 

     

    반응형

    '프로그래머스(Programmers)' 카테고리의 다른 글

    없는 숫자 더하기  (0) 2021.12.11
    문자열 압축  (0) 2021.12.10
    루시와 엘라 찾기  (0) 2021.12.08
    숫자 문자열과 영단어  (0) 2021.12.06
    주식가격  (0) 2021.12.03

    댓글

Designed by Who.