쌓고 쌓다

[프로그래머스] 오픈채팅방 C++ 풀이 본문

알고리즘/프로그래머스

[프로그래머스] 오픈채팅방 C++ 풀이

승민아 2022. 7. 12. 17:00

https://school.programmers.co.kr/learn/courses/30/lessons/42888?language=cpp 

 

프로그래머스

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

programmers.co.kr

전체 코드

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

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string,string> m;
    for(int i=0;i<record.size();i++)
    {
        vector<string> v;
        string str;
        for(int j=0;j<record[i].length();j++)
        {
            if(record[i][j]==' ')
            {
                v.push_back(str);
                str="";
            }
            else
            {
                str+=record[i][j];
                if(j+1==record[i].length())
                    v.push_back(str);
            }
        }
        
        if(record[i][0]=='E')
        {
            if(m.find(v[1])!=m.end())
                m[v[1]]=v[2];
            else
                m.insert(pair<string,string>(v[1],v[2]));
        }
        else if(record[i][0]=='C')
            m[v[1]]=v[2];    
    }
    
    for(int i=0;i<record.size();i++)
    {
        vector<string> v;
        string str;
        for(int j=0;j<record[i].length();j++)
        {
            if(record[i][j]==' ')
            {
                v.push_back(str);
                str="";
            }
            else
            {
                str+=record[i][j];
                if(j+1==record[i].length())
                    v.push_back(str);
            }
        }
        
        
        if(record[i][0]=='E')
            answer.push_back(m[v[1]]+"님이 들어왔습니다.");
        else if(record[i][0]=='L')
            answer.push_back(m[v[1]]+"님이 나갔습니다.");

    }
    return answer;
}

 

풀이 방법

일단 모든 입장과 퇴장, 닉네임 변경의 과정이 끝난 후의 유저의 이름을 map에 저장을 한다.

닉네임의 변경이 일어나는 입장(Enter)과 변경(Change)의 record를 찾아내 변경사항을 map을 통해 관리한다.

그리고 최종적으로 보이게 될 입장(Enter)과 퇴장(Leave)을 뽑아내 answer에 추가한다.

이때, map에 저장된 유저 아이디를 통해 최종적으로 유저가 정한 닉네임을 이용하면 된다.

 


map<string,string> m;
for(int i=0;i<record.size();i++)
{
	vector<string> v;
	string str;
	...
}

map의 m에는 유저의 아이디를 통해 닉네임을 저장할 것이다.

for문을 통해 모든 record를 돌 것이며 이때 공백(' ')을 통해 문자열을 분리해 str에 저장할 것이며

분리된 문자열은 v에 저장할 것이다.

 

for(int j=0;j<record[i].length();j++)
{
    if(record[i][j]==' ')
    {
        v.push_back(str);
        str="";
    }
    else
    {
    	str+=record[i][j];
        if(j+1==record[i].length())
            v.push_back(str);
    }
}

i번째 record를 탐색할 때

공백(' ')을 만난다면 한 단어로 문자열을 분리가 끝난 것으로 v에 넣어주고

쪼개진 문자열을 넣을 str을 다시 아무것도 없는 상태로 초기화시켜준다.

만약 공백이 아니라면 str에 문자(record[i][j])를 붙여주고 만약 이것이 문자열의 끝이라면 v에 넣어준다.

 

if(record[i][0]=='E')
{
    if(m.find(v[1])!=m.end())
        m[v[1]]=v[2];
    else
        m.insert(pair<string,string>(v[1],v[2]));
}
else if(record[i][0]=='C')
	m[v[1]]=v[2];

이제 문자열을 공백으로 쪼개 v에 다 넣었으니, 이것을 이용해 닉네임의 변경사항을 기록해야 한다.

만약 입장(Enter)을 하였다면 v[0]에는 Enter이, v[1]에는 아이디, v[2]에는 닉네임이 쪼개져 들어져 있을 것이다.

이때, 아이디를 이용해 m에서 찾아 존재한다면 닉네임을 바꿔주면 된다.

존재하지 않는다면 m에 새로 추가해주면 된다.

만약 변경(Change)을 하였다면 입장과 마찬가지로 v[0], v[1], v[2]에 동일하게 들어가 있을 것이고

이것을 이용해 m에서 아이디를 이용해 찾아 닉네임을 변경한다. 이때 변경이므로 무조건 m에 존재한다.

 

이제 모든 닉네임 변경 상태와 정보들을 m에 저장했으니 이것을 이용해 입장과 퇴장을 answer에 넣어주자.

for(int i=0;i<record.size();i++)
{
        vector<string> v;
        string str;
        ...
}

마찬가지로 모든 record를 돌면서 또 v에 쪼개서 넣는 과정이 필요하다.

 

for(int j=0;j<record[i].length();j++)
        {
            if(record[i][j]==' ')
            {
                v.push_back(str);
                str="";
            }
            else
            {
                str+=record[i][j];
                if(j+1==record[i].length())
                    v.push_back(str);
            }
        }

위에서 설명한 그냥 v에 또 쪼개서 넣는다.

 

이제 최종적으로 보일 채팅방 상태를 보여야 하므로 입장과 퇴장을 고려하면 된다.

Enter인 경우 m에서 최종 닉네임을 찾아 들어왔습니다. 를 answer에 넣고

Leaver인 경우도 m에서 최종 닉네임을 찾아 나갔습니다. 를 answer에 넣는다.

Comments