[lv2] 오픈채팅방

·2023년 4월 28일
0

알고리즘 문제 풀이

목록 보기
119/165
post-thumbnail

풀이요약

풀이상세

  1. 문제는 결국 최종까지 변경된 이름을 아이디에 맞게 반환하는 것이다. 즉 id와 함께 들어오는 이름들을 계속 변경하다가 마지막에 남은 이름을 id를 키로 하여 벡터에 집어넣어 반환하면 된다.

  2. 나의 경우 split을 구현했다. 띄어쓰기 나오는 경우까지의 문자열들을 모두 백터에 집어넣어, 이를 반환하게 한다.

  3. answer 에는 “id 님이 들어왔다”로 먼저 집어넣은 후에, 이후 id를 ⇒ 이름 으로 변경하여 answer 값이 변하도록 한다.

배운점

  • sstream 이라고 문자열을 스트림으로 변환하여 띄어쓰기 만큼 씩 불러오는 것이 있다. 마치 자바의 stringTokenizer 와 유사한데, 이상하게 더 느리다. stream 이라고 다 빠른 건 아닌가 보다.

split 구현

#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
unordered_map<string, string> m;

vector<string> split(string str) {
    vector<string> v;
    string temp = "";
    int idx = -1;
    while(++idx != str.size()) {
        if(str[idx] == ' ') v.push_back(temp),temp = "";
        else temp += str[idx];
    }
    v.push_back(temp);
    return v;
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    // split을 통한 vector<string> 반환
    for(int i=0; i<record.size(); i++) {
        vector<string> sp_v = split(record[i]);
        string cmd = sp_v[0];
        // Enter : map에 이름을 등록 혹은 수정, answer에 "id + 님이 들어왔습니다." 추가
        // Leave : answer에 "id + 님이 나갔습니다." 추가.
        // Change : map에 이름 수정
        if(cmd == "Enter") {
            m[sp_v[1]] = sp_v[2];
            answer.push_back(sp_v[1]+" 님이 들어왔습니다.");
        } else if(cmd == "Leave") {
            answer.push_back(sp_v[1]+" 님이 나갔습니다.");
        } else {
            m[sp_v[1]] = sp_v[2];
        }
    }
    
    
    // id를 최종적으로 남은 map의 이름으로 바꾸기.   
    for(int i=0; i<answer.size(); i++) {
        vector<string> temp = split(answer[i]);
        answer[i] = m[temp[0]]+temp[1]+ " "+ temp[2];
    }   
    return answer;
}
profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글