본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 오픈채팅방] c++ (풀이, 코드, 개념)

by 말린밴댕이_공부 2023. 5. 21.
반응형

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

문제

 

코드 및 풀이

이 문제에서 구분을 해야하는 것은 Change에 집중을 해서 하면 되는 문자열 처리 문제였습니다.

 

1. 만약 입장하였을때 혹은 이름을 바꾸었을때에 대해서  map<uid, 이름아이디> 를 갱신해주는 형태로 진행하였습니다.

2. 입장혹은 나갈때 stateUser<pair<유저의 uid, 유저의 아이디>>에 push_back을 해주었습니다. (1은 입장, 0은 퇴장)

3. stateUser를 돌게 되면서 입장을 하였는지 퇴장을 하였는지에 대해서 answer에 push_back을 합니다.

 

/*
들어왔습니다, 나갔습니다로 메시지 출력
이름을 바꾸는것은 -> 나간 후 새로운 닉네임으로 혹은 채팅방에서 변경

입장, 퇴장, 변경에 대해서 저장을 한다.

그리고 나중에 일괄적으로 진행을 시킨다.
*/

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


using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    vector<string> s;
    vector<pair<string,int>> stateUser; //유저의 uid와 입출 상태(입 : 1, 출 : 2)
    map<string,string> idUser; //uid와 아이디 저장 map
    string token;
    char delimeter = ' ';
   
    for(int i = 0 ; i < record.size();i++){
        istringstream iss(record[i]);
        s.clear(); // s초기화
        while(getline(iss,token,delimeter)){
            s.push_back(token);
        }
        if(s[0] =="Enter" || s[0] == "Change")
            idUser[s[1]] = s[2];
        if(s[0] == "Enter")
            stateUser.push_back(make_pair(s[1],1));
        else if(s[0] == "Leave")
            stateUser.push_back(make_pair(s[1],0));
    }
   
    for(int i = 0; i < stateUser.size();i++){
        //입장일때
        if(stateUser[i].second == 1){
            answer.push_back(idUser[stateUser[i].first]+"님이 들어왔습니다.");
        }
        else{ //나갈때
            answer.push_back(idUser[stateUser[i].first]+"님이 나갔습니다.");
        }
    }
   
    return answer;
}

 

반응형

댓글