본문 바로가기

코딩테스트/프로그래머스

[프로그래머스] 오픈채팅방

728x90
반응형


🔗 문제 링크

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

 

프로그래머스

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

programmers.co.kr


728x90

👩‍💻 코드

#include <string>
#include <vector>
#include <utility>
#include <map>
#include <iostream>

using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    vector<pair<string, string>> events;
    map<string, string> users;
    
    for(auto r : record){
        int pos = r.find(' ');
        string event = r.substr(0, pos);
        string uid = r.substr(pos + 1, r.find(' ', pos + 1) - (pos + 1));
        
        if(event != "Leave"){
            string name = r.substr(r.rfind(' ') + 1);
            users[uid] = name;
        }
        
        if(event != "Change"){
            events.push_back({event, uid});
        }
    }
    
    for(auto event : events){
        string result = users[event.second] + "님이 ";
        result += (event.first == "Enter") ? "들어왔습니다." : "나갔습니다.";
        answer.push_back(result);
    }
    
    return answer;
}

📝 풀이

기록이 담긴 record에서 공백을 기준으로 문자열을 추출합니다.

pos는 첫 번째 공백의 위치입니다.

event는 r의 시작부터 첫 번째 공백 위치까지의 문자열입니다.

uid는 r의 첫 번째 공백 위치 다음부터 두 번째 공백 위치 전까지 문자열입니다.

 

event가 "Enter"나 "Chnage"면 닉네임을 업데이트 해야합니다.

name은 r의 마지막 공백 위치 다음부터 끝까지의 문자열입니다.

map에 uuid를 key로 name을 value로 저장합니다.

 

event가 "Enter"나 "Leave"면 events에 추가해야합니다.

 

문제에 주어진 메세지 형태로 answer에 저장합니다.

users map에서 uuid로 아이디를 result에 추가합니다.

result에 event에 따라 "들어왔습니다."와 "나갔습니다."를 추가합니다.

 

최종적으로 answer를 return 합니다.

이 문제는 문자열을 공백으로 추출하고 각 이벤트에 경우에 맞는 조건문을 활용하면 쉽게 풀 수 있습니다.

728x90
반응형