프로그래머스/Level_2

[Level_2 / C++ / 카카오] 튜플

배발자 2022. 1. 19.
반응형

 

먼저 이차원 벡터안에 각 원소들의 숫자의 개수들을 집어넣고 각 벡터의 사이즈만큼 sort 한 후 

map 자료구조를 통해 없는 원소들을 추가해주는 식으로 진행했다. 

 

로직은 쉬워서 문자열로 제공되는 저 숫자들을 어떻게 빼내야 할지가 관건인 문제인거 같기도하다. 

 

내가 푼 방식은  substr 함수와 find 함수를 익힐겸 해봤는데 이 방식 말고 다른 방식을 쓰는것을 추천한다 

예를 들어, 방식은 여러가지가 있겠지만 가장 간단한 방법은 문자열을 차례대로 살펴보면서 그냥 숫자만 보면된다. 

',' , '{', '}' 이러한 문자를 만났을 때는 그냥 else로 다 처리하란말이다. 

 

string s= ""; 

 

숫자야? 응  s += 숫자1

숫자야? 응  s += 숫자2

숫자야? 아니   s == "숫자1숫자2"  이 값을 정수형으로 바꿔서 이 값의 인덱스에 해당하는 배열에 카운팅을 해준다.

 

즉, 튜플의 원소의 숫자가 아무리 뒤바껴서 나와도 제일 많이 나온 숫자가 반환할 때 가장 앞에 위치할 값이라는 것이다. 

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
vector <vector<int>> v;
bool cmp(vector <int> v1, vector<int> v2) {
    return v1.size() < v2.size();
}
vector<int> solution(string s) {
    vector<int> answer;
    int check = 0;
    s = s.substr(1, s.size() - 2);
    while (1) {
        vector <int> st;
        int a = s.find('{');
        int b = s.find('}');
        string s1 = s.substr(a + 1, b - a - 1);
        int pos;
        int cnt = 0; 
        while ((pos = s1.find(',')) != string::npos) {
            string s2 = s1.substr(0, pos);
            st.push_back(stoi(s2));
            s1 = s1.substr(pos + 1);    
        }
        st.push_back(stoi(s1)); 
        v.push_back(st);
        if (b == s.size() - 1)break;
        s = s.substr(b + 1);
    }    
    sort(v.begin(), v.end(),cmp); 
    map <int, int> m; 
    for (int i = 0; i < v.size(); i++) {
        for (int j = 0; j < v[i].size(); j++) {
            if (m[v[i][j]])continue; 
            else {
                m[v[i][j]]++; 
                answer.push_back(v[i][j]); 
            }
        }
    }
    return answer;
}

 

 

코딩테스트 연습 - 튜플

"{{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

 

반응형

댓글