본문 바로가기
알고리즘 부셔버렷/ProblemSolving

[프로그래머스] 튜플 (문제 설명, 해결 과정, 코드 전문, c++)

by Unagi_zoso 2022. 6. 7.

 

  문제 설명

 

 

본 문제는 프로그래머스의 튜플 문제입니다.

 

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

 

 

 

 

 

 

 

  해결 과정

 

튜플의 원소들에게는 정해진 순서가 있기에 원소들을 보면 자신보다 작은 집합에서 한 가지의 요소만

더 더해진 형태로 있습니다. 이 점을 이용해 작은 집합부터 체크를 해서 중복된 요소를 배제하겠습니다. 

우선 주워진 문자열에서 각 집합별로 뽑아내 배열에 저장합니다. 각 집합별로 뽑아내며 이때 나오는

모든 원소들을 중복을 가리기 위한 배열에 다음과 같은 {원소, 0} pair의 형태로 저장합니다.

이후 각 집합의 길이 별로 정렬을 합니다. 이후 집합의 요소들을 불러들여 중복을 체크하고

중복 되지 않았다면 반환배열에 저장하고 중복확인배열의 본인 인덱스 값 0을 1로 바꿉니다.

이 과정을 마친 뒤 반환배열을 반환합니다.

 

 

 

 

  코드 전문

 

 

#include <string>
#include <vector>
#include <unordered_map>
#include <cctype>
#include <algorithm>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    vector<int> v;
    vector<vector<int>> v_v;
    unordered_map<int, int> overlap;
    string temp_str;
    for (auto ch : s)
    {
        if (isdigit(ch)) {temp_str+= ch;}
        else
        {
            
            if(!temp_str.empty()) 
            {
                v.emplace_back(stoi(temp_str));
                overlap.insert(make_pair(stoi(temp_str), 0));
                temp_str.clear();
            }
            if (ch == '}')
            {
                v_v.emplace_back(v);
                v.clear();
            }
        }
    }
    
    sort(v_v.begin(), v_v.end(), [](vector<int> a, vector<int> b) -> bool
                             {if(a.size() < b.size()) return true; else return false;});
    
     for (auto v : v_v)
        for (auto d : v)
        {
            if (overlap[d] == 0) {answer.emplace_back(d); overlap[d] = 1;}
        }
    return answer;
}

 

 

 

 

  느낀 점 (잡설 99% , 배운점 1%(많은 편))

 

더보기

문제를 잘 확인해야겠습니다. 문제의 설명 만으로는 해석에 한계가 있으니 예를 잘 읽어 이해해야겠습니다.

본격적인 문제풀이에 앞서 어떻게 문제를 풀어나갈지 제대로 계획해두고 시작해야할 것 같습니다.

두루뭉실하게 풀어버리면 시간만 버리고 제대로 풀지 못하는 것 같습니다.

 

 

 

 

 

 

 

 

긴 글 읽어주셔서 감사합니다. 

부족한 점이 있다면 부디 알려주시면 감사하겠습니다.

 

댓글