습관처럼

programmers [C++] : 2019 카카오 개발자 겨울 인턴십 튜플 본문

Algorithms/programmers

programmers [C++] : 2019 카카오 개발자 겨울 인턴십 튜플

dev.wookii 2020. 6. 22. 16:44

programmers.co.kr/learn/courses/30/lessons/64065

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

문제 설명


셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다.

n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다. (a1, a2, a3, ..., an)

DERECTION

튜플은 다음과 같은 성질을 가지고 있습니다.

1. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)

2. 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)

3. 튜플의 원소 개수는 유한합니다.

 

예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는 {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}가 됩니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로

{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}} , {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}} , {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}} 는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.

 

접근 방법


어떻게 하면 쉽게 풀까 고민하다 결국은 원시적으로 풀었네요 ㅠㅠ

1. 첫 '{' 마지막'}'는 의미가 없으므로 범위를 지정할때 1 부터 n-2부터 진행합니다.

2.  '{'를 시작으로 ','이전까지의 숫자를 합쳐 임시 vector에 저장합니다. 이렇게 하나의 숫자를 저장할때마다 count를 해줍니다.

(원소의 개수가 3개면 vec[3]에 저장되도록 하기 위해서 카운트를 했습니다~)

3. 저장소인 임시벡터의 원소를 ans백터에 넣습니다.

4. 원소가 1개인 벡터에서 원소를 Int로 바꾸어 넣어주면서 중복을 피합니다.

 

 

코드


#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool chk(int a, vector<int>ans){
    for(int i=0;i<ans.size();i++){
        if(ans[i]==a) return false;
    }
    return true;
}
vector<int> solution(string s) {
    vector<int> answer;
    int s_size=s.size();
    int count=0;
    int numOfAtom=0;
    
    vector<string>ans[1000001];
    vector<string>temp;
    string a="";
    for(int i=1;i<s_size-1;i++){
        if(s[i]=='{') continue; 
        else if(s[i]=='}'){
            count++;
            numOfAtom++;
            temp.push_back(a);
            for(int k=0;k<temp.size();k++)
                ans[numOfAtom].push_back(temp[k]);
            a="";numOfAtom=0;
            temp.clear();
            continue;
        }
        else if(s[i]==','){
            if(a.compare("")!=0){
                numOfAtom++;
                temp.push_back(a);
                a="";
            }
            else continue;      
        } 
        else a+=s[i];
        
    }
    for(int i=1;i<=count;i++){
        for(int j=0;j<ans[i].size();j++){
            int num=stoi(ans[i][j]);
            if(chk(num,answer)==false)continue;
            answer.push_back(num);
        }
    }
    
    return answer;
}

funny algorithm )_<