알고리즘/프로그래머스 2단계

프로그래머스 - 오픈채팅방 - C++

게임만드는학생 2024. 8. 7. 15:31

 

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

 

프로그래머스

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

programmers.co.kr

 

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

vector<string> solution(vector<string> record) {
    vector<string> answer;
    vector<pair<char,string>> v;
    unordered_map<string,string> um;
    
    for(int i=0;i<record.size();i++)
    {
        if(record[i][0]=='L')
        {
            string uid=record[i].substr(6);
            v.push_back({'L',uid});
        }
        else
        {
            if(record[i][0]=='C')
            {
                string temp=record[i].substr(7);
                int idx = temp.find(' ');
                string uid=temp.substr(0,idx);
                string nick = temp.substr(idx+1);
                um[uid]=nick;
            }
            else
            {
                string temp=record[i].substr(6);
                int idx = temp.find(' ');
                string uid=temp.substr(0,idx);
                string nick = temp.substr(idx+1);
                um[uid]=nick;
                v.push_back({'E',uid});
            }
        }
    }
    
    for(int i=0;i<v.size();i++)
    {
        string s="";
        s+=um[v[i].second];
        if(v[i].first=='L')
            s+="님이 나갔습니다.";
        else if(v[i].first=='E')
            s+="님이 들어왔습니다.";
        answer.push_back(s);
    }
    return answer;
}

저장된 데이터가 주어지면 그걸 분석해서 answer 에 담는 문제이다. 

공백을 기준으로 enter,leave,change 와 유저아이디 닉네임이 주어진다. 

 

먼저 {유저의 행동, 아이디} 를 기록할 vector와 {아이디, 닉네임} 을 저장할 map 을 사용했다. 

마지막으로 변경된 닉네임을 알기 위해서이다.

 

따라서 문자열을 구분해서 첫글자가 L,C,E 인가에 따라서 저장한다. 

그리고 v를 for문으로 돌며 map에서 유저아이디에 매치되는 닉네임을 가져오고 행동에 따라서 문자열을 더한다.

그리고 answer에 순서대로 저장하면 된다.