문제 링크
문제 설명
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; }
공부한 것을 정리하기 위한 기록입니다.
틀린 부분이 있다면 부드럽게 알려주세요.
댓글