문제설명이 길지만 요약해보자면 채팅방에 나가고 들어오는 것을 기록하고 아이디에 대한 닉네임은 제일 마지막에 사용자가 등록한 것으로 사용한다. 

일단 공백을 기준으로 문자열을 나누는것이 중요하다. 

문자열을 나누는 방법은 나는 sstream을 자주 사용해서 이 방법을 같이 첨부한다.

※sstream 활용

stringstream ss;
 for (auto reco : record) {
     ss.str(reco);			//record배열에서 하나씩 가져와서 string 형태로 변환
     string status, id, name;			//빈칸을 기준으로 나눌 단어를 넣을 변수
     ss >> status >> id >> name;		//string 형태로 변환된 단어를 분할하여 변수에 차례로 저장
     ss.clear();						//ss을 초기화하여 다음 요소를 분할할 수 있도록 함.
 }

 

이후 map을 사용하여 기록된 아이디와 닉네임을 추가하는 방법까지는 생각했는데 이 다음이 잘 생각나지않았는데 힌트를 보니 굳이 map에서 전부다 계산하는 것보다 행동과 아이디를 나누어서 나중에 더해주는 방식이 좋을 것 같아 그렇게 해보았다.

전체코드

#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
//닉네임은 맵을 통해 최신화해주기
//나머지는 어떻게 저장해둘것인가..
//->따로 배열을 만들어서 저장하는게 좋겠다=> state배열 answer에는 id만 저장해서 나중에 합쳐주기
vector<string> solution(vector<string> record) {
    vector<string> answer, state;
    map<string, string> m;
    stringstream ss;
    for (auto reco : record) {
        ss.str(reco);
        string status, id, name;
        ss >> status >> id >> name;
        ss.clear();
        if (status == "Enter") {
            state.push_back("님이 들어왔습니다.");
            answer.push_back(id);               //id를 저장해서 나중에 state와 map을 합치기
            m[id] = name;
        }
        else if (status == "Leave") {
            state.push_back("님이 나갔습니다.");
            answer.push_back(id);
        }
        else {
            m[id] = name;
        }


    }

    for (int i = 0; i < answer.size(); i++) {
        answer[i] = m[answer[i]] + state[i];
    }
    return answer;
}

 

+ Recent posts