[C++로 풀이] 오픈채팅방 ⭐⭐

Date:     Updated:

카테고리:

태그:

📌 오픈채팅방

난이도 ⭐⭐

🚀 문제

image

image


🚀 내 풀이 ⭕

#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 이 과정 하나로 수정 되므로 이 문장 하나로 추가, 수정, 변경 안됐는데 또 덮어쓰기가 됨.
  • 두 번째 for문
    • 닉네임 + 명령어 형태로 출력하기!
    • 닉네임은 info[command_vec[i].first 아이디 Key로 가져오면 되고 명령어는 command_vec[i].second


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers 카테고리 내 다른 글 보러가기

댓글 남기기