ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 튜플 [C++]
    문제 풀이/프로그래머스 2023. 8. 23. 13:35
    반응형

     이 문제는 문자열, 정렬, 맵을 이용해서 풀었다. 이 문제의 핵심은 문자열로 주어진 집합을 이차원 배열로 파싱하는 것과, 파싱된 정수 배열에서 원래 튜플을 찾아내는 것이다.

     

     

     문자열 파싱같은 경우에는 다음과 같은 수도 코드를 작성하여 구현하였다.

    여는 괄호 나오면 반복문 시작(닫는 괄호 나올 때까지)
    	숫자면 
    		append
    	쉼표면
    		vector에 push, append 스트링 초기화

     

     또한 원래 튜플을 찾아내는 것은 정수 배열들 중에 가장 작은, 즉 길이가 1인 배열부터 보면 해당 배열의 숫자가 반드시 원래 튜플의 첫번째 자리임을 알아내면 규칙성을 쉽게 찾을 수 있다. 첫번째 자리를 찾으면, 그 다음 길이가 2인 배열을 보고 기존에 있지 않은 숫자가 2번째 자리이고, 쭉 반복하면 원래 튜플을 찾을 수 있다.

     

     

     전체 코드는 다음과 같다.

    #include <string>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <map>
    
    using namespace std;
    
    map<int, bool> mp;
    
    bool compare(vector<int>& a, vector<int>& b) {
        return a.size() < b.size();
    }
    
    vector<int> solution(string s) {
        vector<int> answer;
        
        string input = s.substr(1, s.size() - 2);
        
        int index = 0;
            
        vector<vector<int>> numbers;
        
        // 문자열 파싱
        while (index < input.size()) {
            if (input[index] == '{') {
                vector<int> temp;
                string append = "";
                index++;
                
                while (true) {
                    if ('0' <= input[index] && input[index] <= '9') {
                        append += input[index];
                    }
                    else if (input[index] == ',') {
                        temp.push_back(stoi(append));
                        append = "";
                    }
                    else if (input[index] == '}') {
                        if (!append.empty()) {
                            temp.push_back(stoi(append));
                            append = "";
                        }
                        break;
                    }
                    index++;
                }
                index++;
                
                if (!temp.empty())
                    numbers.push_back(temp);
            }
            else {
                index++;
            }
        }
        
        // 정렬
        sort(numbers.begin(), numbers.end(), compare);
        
        for (vector<int>& num : numbers) {
            for (int n : num) {
                if (!mp[n]) {
                    answer.push_back(n);
                    mp[n] = true;
                }
            }
        }
        
        return answer;
    }
    반응형
Designed by Tistory.