[프로그래머스] 튜플

hamsteak·2023년 10월 12일
0

ps

목록 보기
38/39

주어진 문자열로부터 튜플을 구하는 문제.

각 중괄호 안 수열을 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;
}
profile
안녕하세요

0개의 댓글