Written

프로그래머스 레벨2 <오픈채팅방> C++ 풀이 본문

알고리즘 문제풀이

프로그래머스 레벨2 <오픈채팅방> C++ 풀이

steeringhead 2023. 9. 28. 17:35

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

 

프로그래머스

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

programmers.co.kr

이 문제를 풀면서 stringstream에 대해서 공부 해 볼 수 있어서 좋았습니다. 기존에는 문자열을 파싱하려고 할 때, 보통 파싱의 기준이 되는 문자에서 if문 처리를 하거나, 마지막 인덱스에서 분기처리를 하는 방식으로 문제를 풀곤 했었는데 이 문제를 기존에 제가 풀던 방식대로 하면서 풀리지를 않아 인터넷에 올라와있는 풀이를 참고하면서 sstream헤더파일을 사용하는 문자열 파싱에 대해서 학습해 볼 수 있었습니다.

 

사실 문제 자체는 크게 어렵지 않습니다. 입력 문자열을 Enter , Leave , Change에 따라 분기처리하여 Leave인 경우를 제외하고, 유저아이디에 따라 닉네임을 map에서 계속 갱신시켜주기만 하면 답을 구하는 아이디어는 어렵지 않습니다. 다만 문자열 파싱의 과정에서 저 같은 경우에는 애를 먹었기 때문에, 만약 stringstream을 모르고 계셨다면 이 문제를 계기로 공부해보시면 좋을 것 같습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <string>
#include <vector>
#include <sstream>
#include <map>
 
using namespace std;
 
vector<string> solution(vector<string> record) {
    vector<string> result, state;
    map<string,string> m;
    
    for(int i=0;i<record.size();i++)
    {
        stringstream ss(record[i]);
        string str[3];
        string tmp;
        int idx = 0;
        while(ss >> tmp)
          str[idx++= tmp;
        
        if (str[0== "Enter")
        {
            state.push_back("들어왔습니다.");
            result.push_back(str[1]);
            m[str[1]] = str[2];
        }
        else if (str[0== "Leave")
        {
            state.push_back("나갔습니다.");
            result.push_back(str[1]);
        }
        else
        {
            m[str[1]] = str[2];
        }
    }
    
    for (int i=0;i<result.size();i++)
    {
        result[i] = m[result[i]] + "님이 " + state[i];
    }
    
    return result;
}
cs
Comments