본문 바로가기
카테고리 없음

[Progammers] 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방

by Saerong2 2020. 9. 9.

문제 링크

문제


문제 설명

solution() 함수의 인자인 record에는 띄어쓰기를 통해 구분된 op, id, name 정보가 담긴 string들이 있습니다.

예를 들어서 "Enter uid1234 John" 과 같은 문자열이 여러 개 들어 있는 것이지요.

이러한 문자열을 op, id, name으로 파싱을 해야하는데 어떻게하면 보다 간단히 할 수 있을까요?

 

만약에 c++에서 저러한 문자열을 직접 입력받는다면 아래와 같이 간단히 받을 수 있을 것입니다.

cin >> op >> id >> name;

 

이 문제의 record에 담긴 string 역시 stringstream을 이용하면 위와 같은 방식으로 쉽게 처리할 수 있습니다.

stringstream은 아래와 같이 string을 인자로 받아 stream안에 그 값을 넣을 수 있습니다.

물론 이 문제에서는 op이 Leave일 때, name을 입력받지 않기 때문에 구분해서 처리해야합니다.

stringstream ss(s);
ss >> op >> id >> name;

 

우리는 id와 name의 mapping을 저장해야하며 c++의 map을 사용할 수 있습니다.

 

문제의 디스크립션을 잘 보면, Change를 통해 어떠한 Id의 name이 변경될 경우

그 이전에 해당 Id로 Enter하거나 Leave했던 기록들 모두 새로운 name으로 바뀌게 됩니다.

따라서 이 문제는 online으로는 알 수 없고, record 벡터 안의 모든 정보들을 읽고 난 후에야 답을 찾을 수 있습니다.

여기서 online은 한 쿼리를 읽고 그것을 바로 처리하는 것을 말합니다.

따라서 offline으로 이를 처리하기 위해 어떤 id에 해당하는 사람이 들어왔는지 혹은 나갔는지만 저장하면 됩니다.

이는 pair<id: string, isEnter: bool>과 같은 자료형을 순서대로 vector에 담아서 유지할 수 있습니다

 


소스코드

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

using namespace std;

map<string, string> mp;
vector <pair<string, int> > ans;

void parse(string& s)
{
    string op, id, name;
    stringstream ss(s);
    ss >> op;
    if (op == "Leave") {
        ss >> id;
        ans.push_back({ id, 1 });
    } 
    else {
        ss >> id >> name;
        mp[id] = name;
        if (op == "Enter")
        	ans.push_back({ id, 0 });
    }
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    for (int i = 0; i < record.size(); ++i) {
        parse(record[i]);
    }
    for (int i = 0; i < ans.size(); ++i) {
        if (ans[i].second == 0)
        	answer.push_back(mp[ans[i].first] + "님이 들어왔습니다.");
        else
        	answer.push_back(mp[ans[i].first] + "님이 나갔습니다.");
    }
    return answer;
}

 

 

 

 

 

공부한 것을 정리하기 위한 기록입니다.

틀린 부분이 있다면 부드럽게 알려주세요.

댓글