baekjoon, programmers

programmers 튜플

leon-mcd 2024. 7. 25. 17:14

programmers

level2 튜플

문제 설명

프로그래머스 아이콘
위 이미지를 클릭하시면 해당 문제로 이동합니다.

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

using namespace std;

vector<int> solution(string s) {
    vector<int> answer, temp;
    vector<pair<int,int>> conclusion;
    string str_nums, str_seg;
    int max=0;

    for(int i = 0; i< s.size(); i++){
        if(s[i]!='{' && s[i]!='}') str_nums+=s[i];
    }

    istringstream iss(str_nums);
    while(getline(iss, str_seg, ',')){
        temp.push_back(stoi(str_seg));
        if(temp.back()>max) max = temp.back();
    }

    conclusion.resize(max+1, {0,0});

    for(int i : temp){
        conclusion[i].first++;
        conclusion[i].second = i;
    }

    sort(conclusion.rbegin(), conclusion.rend());

    for(pair<int,int> i : conclusion) if(i.first!=0){answer.push_back(i.second);}
    return answer;
}

해결 과정

문제 자체는 간단했는 데, 문자열을 int형으로 변환하는 것이 더 어려웠던 것 같다. 다른 사람의 풀이를 보니 문자열을 차례대로 탐색하면서 숫자면 임시 문자열에 추가하고 숫자가 아닌 경우에 임시 문자열을 stoi를 통해 int형으로 변환하여 vector에 넣어주는 방법을 알게되었다.
해당 방법이 더욱 좋은 방법인 것 같아 밑에 활용해서 코드를 수정해보겠다.
튜플을 생성하는 과정은 비교적 간단한 데, 여러 번 나온 숫자를 앞에 위치시키면 정답이다.
예를 들어 4가지 숫자를 가진 튜플에서 첫 번째 항은 총 4번 부분집합으로 등장하며 두 번째 항은 총 3번, 세 번째 항은 2번, 네 번째 항은 1번 등장한다.
이를 등장횟수와 숫자를 pair로 vector에 추가하여 내림차순으로 정렬한 뒤에 숫자를 결과 vector에 추가해주는 방법으로 해결할 수 있었다.

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

using namespace std;

vector<int> solution(string s) {
    vector<int> answer, temp;
    vector<pair<int,int>> conclusion;
    string str_num, str_seg;
    int max=0;

    for(char i : s){
        if(i-'0'>=0 && i-'0'<=9) str_num+=i;
        else{
            if(str_num.size()){
                temp.push_back(stoi(str_num));
                if(temp.back()>max) max = temp.back();
            }
            str_num.clear();
        }
    }

    conclusion.resize(max+1, {0,0});

    for(int i : temp){
        conclusion[i].first++;
        conclusion[i].second = i;
    }

    sort(conclusion.rbegin(), conclusion.rend());

    for(pair<int,int> i : conclusion) if(i.first!=0){answer.push_back(i.second);}
    return answer;
}

'baekjoon, programmers' 카테고리의 다른 글

programmers 프로세스  (0) 2024.07.26
programmers 기능 개발  (0) 2024.07.25
programmers 캐시  (0) 2024.07.25