Study/Algorithm

프로그래머스 (C/C++) 64065 : 튜플

hwooo 2024. 11. 20. 01:22

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


풀이

입력된 문자열을 '{', '}' 기준으로 나누고, 그 문자열을 ',' 기준으로 나누며 숫자로 변환한다.

이렇게 나눠진 숫자 배열들을 길이 순으로 정렬하여 앞에서부터 탐색한다. 이 때 나온 값인지 확인하여 나오지 않은 값이면 answer 배열에 저장하며 답을 만든다.


코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

// , 기준으로 파싱 및 숫자 변환
vector<int> strToNumList(string s) {
    vector<int> nums;
    
    int start = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == ',') {
            nums.push_back(stoi(s.substr(start, i - start)));
            start = i + 1;
        }
    }
    nums.push_back(stoi(s.substr(start)));
    
    return nums;
}

// {} 기준으로 문자열 파싱
vector<vector<int>> divideStr(string s) {
    vector<vector<int>> v;
    int start = 2, end = 2;
    
    while (end < s.size()) {
        while (end < s.size() && s[end++] != '}');
        v.push_back(strToNumList(s.substr(start, end - start - 1)));
        start = end + 2;
        end = start;
    }
    return v;
}

bool cmp(vector<int> a, vector<int> b) { return a.size() < b.size(); }

vector<int> solution(string s) {
    vector<int> answer;
    
    vector<vector<int>> v = divideStr(s);
    
    // 문자열 길이 기준으로 정렬
    sort(v.begin(), v.end(), cmp);

    // 나온 값인지 체크하며 답 반환
    bool visited[100'001] = {0, };
    
    for (vector<int> nums : v) {
        for (int n : nums) {
            if (visited[n]) continue;
            answer.push_back(n);
            visited[n] = true;
        }
    }
    return answer;
}