주어진 문자열로부터 튜플을 구하는 문제.
각 중괄호 안 수열을 MultiSet에 담아두었다가 가장 작은 크기의 MultiSet부터 순회하면서 answer과 겹치는 부분을 erase하고 남은 하나의 원소를 answer에 삽입한다.
다른 코드를 보니 각 원소의 등장횟수만을 이용해서 구할 수 있는 문제였다. 중복되는 원소가 없는 튜플이 주어진다고 명시된 걸 놓쳐서 괜히 복잡하게 구현해버린 것 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/64065
cpp code
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <set>
using namespace std;
struct cmp {
bool operator()(const multiset<int>& lhs, const multiset<int>& rhs) {
return lhs.size() < rhs.size();
}
};
vector<int> solution(string s) {
vector<int> answer;
stringstream ss(s.substr(1, s.length()-2));
vector<multiset<int>> vv;
int buf_size = 0;
for (int i=1; i<s.length()-1; i++) {
if (s[i] != '{') continue;
int j=i+1;
for (; j<s.length()-1; j++) {
if (s[j] == '}') break;
}
multiset<int> MS;
stringstream ss(s.substr(i+1, j-(i+1)));
string buf;
while (getline(ss, buf, ',')) {
MS.insert(stoi(buf));
}
vv.push_back(MS);
i = j;
}
sort(vv.begin(), vv.end(), cmp());
for (multiset<int> MS : vv) {
for (int i : answer) {
MS.erase(i);
}
answer.push_back(*MS.begin());
}
return answer;
}