1 분 소요

Question

  • 이중 for루프로 한 문자씩 temp에 담아 공백이나 string의 end()를 만나면 각각의 trigger, userid, name을 구분하여 저장한다.
  • userid는 중복이 안되기 때문에 map으로 저장한다. 같은 userid가 name이 바뀌면 해당 name으로 업데이트 시켜준다.
  • Enter, Leave, Change상태와 어떤 유저가 행동을 취하였는지 알기위해 userid로 pair형태로 vector에 담아준다.
  • trigger에 따라 출력문을 만들고 키값인 userid로 name을 가져와 answer에 담아준다. Change는 무시하면 된다.

Solution

Q Q2


Cord

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

vector<string> solution(vector<string> record) 
{
    vector<string> answer;
    unordered_map<string, string> log;     // (id, name)
    vector<pair<string, string>> trigger;  // (Enter Leave Change, id)
    

    for (int i = 0; i < record.size(); ++i)
    {
        int cnt = 0; // 공백의 순서
        string temp = "";
        string key = "";
        string trigg = "";
        
        for (auto it = record[i].begin(); ; ++it)
        {
            // 공백이 아닌 마지막 지점
            if (it == record[i].end() && cnt == 1) { key = temp; break; }   // Leave는 id가 마지막
            else if (it == record[i].end() && cnt == 2) { log[key] = temp; break; } // 세 번째의 끝: name 저장
            
            if (*it != ' ')  { temp += record[i][it-record[i].begin()]; } 
            else
            {
                if (cnt == 0) { trigg = temp; ++cnt; }         // 첫 번째 공백: trigger 저장
                else if (cnt == 1) { key = temp; ++cnt; }      // 두 번째 공백: userId 저장                 
                
                temp = "";
            }
        }
        trigger.push_back({ trigg, key });
    }
    
    // Trigger에 따라 출력하기
    for (int i = 0; i < trigger.size(); ++i)
    {
        string temp;
        if (trigger[i].first == "Enter")
        {
            temp = log[trigger[i].second] + "님이 들어왔습니다.";
            answer.push_back(temp);
        }
        else if (trigger[i].first == "Leave")
        {
            temp = log[trigger[i].second] + "님이 나갔습니다.";
            answer.push_back(temp);
        }
    }

    return answer;
}

Result

Result