Programmers_오픈채팅방

한상현·2021년 6월 22일
0

Algorithm

목록 보기
28/33

출석어찌고하면 map인것 같다. 물론 필자의 뇌피셜.
map을 써야하는 문제는 느낌이 온다. 이건 맵이다! 하는
본 문제도 map을 활용해서 풀었다.
본 문제는 코드를 잘라서 설명하겠다.


    vector<string> answer;
    vector<pair<string, string>> v;
    map<string, string> data;
  • 일단 유저가 나가고 들어오는 순서를 저장해두기 위한 vector v
  • idaction 나가고 들어오는 액션을 저장해뒀다.
  • nickname을 저장하게 되면 안된다. (닉네임은 변화할수 있기 때문.)
  • 영구적인 id를 저장해줘야 한다.
  • data는 변화하는 닉네임을 저장해주기 위해 map을 사용했다.

    for (int i = 0; i < record.size(); i++)
    {
        string str[3];
        string tmp = "";
        int idx = 0;
        for (int j = 0; j < record[i].size(); j++)
        {
            if (record[i][j] == ' ')
            {
                str[idx++] = tmp;
                tmp = "";
            }
            else
                tmp += record[i][j];
        }
        str[idx] = tmp;
        if (str[0] == "Enter" || str[0] == "Change")
            data[str[1]] = str[2];

        if (str[0] == "Enter" || str[0] == "Leave")
            v.push_back(make_pair(str[1], str[0]));
    }
  • 문자열을 돌며 띄어쓰기에 따라 값을 저장해줬다.
  • Enter 의 경우는 새로 들어온 유저가 있을수 있으므로, map에 저장해줬고, Change의 경우는 유저가 닉네임을 바꾼 경우이므로 map을 갱신시켜줬다.(갱신과 저장은 모두 같은 연산)
  • EnterLeave의 경우 순서를 저장해줘야하기 때문에 순서저장벡터에 넣어준다.
    for (int i = 0; i < v.size(); i++)
    {
        string id = v[i].first;
        string tmp = data[id];
        if (v[i].second == "Enter")
            tmp += "님이 들어왔습니다.";
        else if (v[i].second == "Leave")
            tmp += "님이 나갔습니다.";

        answer.push_back(tmp);
    }
  • 순서저장벡터를 돌며 EnterLeave 냐에 따라 문자열을 저장해준다.
  • map[id]의 연산으로 바뀐 닉네임을 반환해주면 문제 끝.

💻 전체코드

#include <string>
#include <vector>
#include <map>
#include <cstring>

using namespace std;

vector<string> solution(vector<string> record)
{
    vector<string> answer;
    vector<pair<string, string>> v;
    map<string, string> data;

    for (int i = 0; i < record.size(); i++)
    {
        string str[3];
        string tmp = "";
        int idx = 0;
        for (int j = 0; j < record[i].size(); j++)
        {
            if (record[i][j] == ' ')
            {
                str[idx++] = tmp;
                tmp = "";
            }
            else
                tmp += record[i][j];
        }
        str[idx] = tmp;
        if (str[0] == "Enter" || str[0] == "Change")
            data[str[1]] = str[2];

        if (str[0] == "Enter" || str[0] == "Leave")
            v.push_back(make_pair(str[1], str[0]));
    }

    for (int i = 0; i < v.size(); i++)
    {
        string id = v[i].first;
        string tmp = data[id];
        if (v[i].second == "Enter")
            tmp += "님이 들어왔습니다.";
        else if (v[i].second == "Leave")
            tmp += "님이 나갔습니다.";

        answer.push_back(tmp);
    }

    return answer;
}
profile
의 공부 노트.

0개의 댓글