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

알고리즘(C++) / 프로그래머스 level 2 : 오픈채팅방

by clean_h 2021. 8. 22.
728x90

level 2 : 오픈채팅방

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

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

코드

//프로그래머스 오픈채팅방
#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

string in = "님이 들어왔습니다.";
string out = "님이 나갔습니다.";
//in out 문장

vector<string> solution(vector<string> record) {
    vector<string> answer;

    map<string, string> person; //아이디, 닉네임
    vector<vector<string>> records;
    for (int i = 0; i < record.size(); i++) {
        string user[3]; //행동, 아이디, 닉네임 순으로 저장
        int temp = 0;
        for (int j = 0; j < record[i].size(); j++) {
            if (record[i][j] == ' ') {
                temp++;
                continue;
            }
            user[temp] += record[i][j];
        }
        vector<string> user_vec;
        user_vec.push_back(user[0]);
        user_vec.push_back(user[1]);
        user_vec.push_back(user[2]);
        records.push_back(user_vec); //행동, 아이디, 닉네임 순으로 벡터에 저장

        if (user[0] == "Enter" || user[0] == "Change") {
            person[user[1]] = user[2]; //아이디에 해당하는 닉네임
        }
    }

    for (int i = 0; i < records.size(); i++) {
        if (records[i][0] == "Enter") {
            //아이디에 해당하는 닉네임을 찾아 출력
            answer.push_back(person[records[i][1]] + in);
        }
        else if (records[i][0] == "Leave") {
            //아이디에 해당하는 닉네임을 찾아 출력
            answer.push_back(person[records[i][1]] + out);
        }
    }

    return answer;
}

int main() {
    vector<string> record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan" };
    solution(record);
    return 0;
}

 

설명

  • 행동 아이디 닉네임 순으로 저장되어있는 string을 나눠서 user배열에 따로따로 저장해주고 records에 저장해준다.
  • 행동이 Enter이거나 Change이면 map에서 아이디에 해당하는 닉네임을 바꿔준다. 
  • 다시 한번 반복하여 행동이 Enter일 때는 map에서 아이디에 해당하는 닉네임을 찾아 [닉네임] + "님이 들어왔습니다"라는 문구를 출력한다.
  • 행동이 Leave일 때는 map에서 아이디에 해당하는 닉네임을 찾아 [닉네임] + "님이 나갔습니다."라는 문구를 출력한다.

 

고찰

record에 담긴 문자열을 바로바로 해석하여 결과를 출력해주었지만 그렇게 되면 같은 닉네임 다른 아이디는 구별을 하지 못하였다. 그래서 해쉬를 이용하여 아이디-닉네임을 연결하여 마지막에 어떤 아이디가 어떤 닉네임으로 연결되는지 확인하여 결과를 출력할 수 있었다.

다른 사람들이 푼 코드를 확인해보니 string을 자를때 stringstream을 사용하였다.

2021.08.22 - [알고리즘] - 알고리즘(C++) / string 자르기 : stringstream, 문자열 파싱istringstream, ostringstream에서 설명하겠다.

문제를 며칠전에 풀었더니 어떤 오류가 있었는지 잘 생각나지 않는다.. 바로바로 기록을 남기도록하자..

 

stringstream 사용 코드

//프로그래머스 오픈채팅방
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sstream>

using namespace std;

string in = "님이 들어왔습니다.";
string out = "님이 나갔습니다.";
//in out 문장

vector<string> solution(vector<string> record) {
    vector<string> answer;

    map<string, string> person; //아이디, 닉네임
    vector<vector<string>> records;
    for (int i = 0; i < record.size(); i++) {
        stringstream stream1(record[i]);
        string move, id, nick;
        stream1 >> move >> id >> nick;

        vector<string> user_vec;
        user_vec.push_back(move);
        user_vec.push_back(id);
        user_vec.push_back(nick);
        records.push_back(user_vec); //행동, 아이디, 닉네임 순으로 벡터에 저장

        if (move == "Enter" || move == "Change") {
            person[id] = nick; //아이디에 해당하는 닉네임
        }
    }

    for (int i = 0; i < records.size(); i++) {
        if (records[i][0] == "Enter") {
            //아이디에 해당하는 닉네임을 찾아 출력
            answer.push_back(person[records[i][1]] + in);
        }
        else if (records[i][0] == "Leave") {
            //아이디에 해당하는 닉네임을 찾아 출력
            answer.push_back(person[records[i][1]] + out);
        }
    }

    return answer;
}

int main() {
    vector<string> record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan" };
    solution(record);
    return 0;
}
728x90

댓글