문제풀이(Problem Solving)

프로그래머스, 오픈채팅방, C++ [CPP] ★★★★

게임이 더 좋아 2022. 9. 14. 10:34
반응형
728x170

https://school.programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

아주 좋은 문제라고 볼 수 있다.

문자열 처리를 함과 동시에 구현 문제이다.

감이 오면 쉽지만.. 어떻게 할지 모른다면 못푼다..ㅠ

 

내 생각의 흐름을 보여주자면

결국 uid에 해당하는 마지막 변경 닉네임만이 중요하다.

문제의 출력도 실시간이 아닌 마지막, 모두 다 처리했을 때를 물어본다.

 

이것이 핵심이라고 할 수 있다.

그리고 stringstream을 쓰는 것도 핵심이다.

문자열 처리에 정말 도움이 된다.


 

#맞은 풀이

#include <string>
#include <vector>
#include <map>
#include <sstream>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string, string> idmap;  //id를 key, nickname을 value
    
    vector<pair<string,string>> rec; // <id, cmd> 쌍이 순서대로 들어있음
    
    //record는 공백으로 token이 구분되어 있음
    //stringstream으로 추출
    
    for(auto it = record.begin(); it != record.end(); it++){
        stringstream ss(*it);  //it가 가리키는 값(string)을 바로 stringstream으로 만듦
        string cmd, id, name;  //3가지 토큰 존재
        ss >> cmd;  //공백까지 읽음
        
        //명령별로 뒤에 오는 token이 다름  compare 함수는 같을때 0을 리턴
        if(cmd.compare("Enter") == 0){
            ss >> id >> name;
            idmap[id] = name;
        }else if(cmd.compare("Change") == 0){
            ss >> id >> name;
            idmap[id] = name;
        }else{
            ss >> id;
        }
        rec.push_back({id,cmd});
    }
    
    //마지막 출력할 때는 idmap에 저장된 nickname을 출력하면 될 것임
    for(auto it = rec.begin(); it != rec.end(); it++){
        auto now = *it;
        auto nId = now.first;
        auto nCmd = now.second;
        if(nCmd.compare("Enter") == 0){
            answer.push_back( idmap[nId] + "님이 들어왔습니다.");
        }else if(nCmd.compare("Leave") == 0){
            answer.push_back( idmap[nId] + "님이 나갔습니다.");
        }
    }
    
    
    return answer;
}
반응형
그리드형