본문 바로가기
알고리즘/프로그래머스

알고리즘(C++) / 프로그래머스 level 2 : 튜플

by clean_h 2021. 8. 27.
728x90

level 2 : 튜플

https://programmers.co.kr/learn/courses/30/lessons/64065?language=cpp 

 

코딩테스트 연습 - 튜플

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

 

코드

//프로그래머스 튜플
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <algorithm>

using namespace std;

//size 내림차순으로 정렬
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
    return a.second > b.second;
}

vector<int> solution(string s) {
    vector<int> answer;
    map<int, int> m;

    //숫자 찾기
    string num = "";
    for (int i = 0; i < s.size(); i++) {
        if (s[i] >= 48 && s[i] <= 57) {
            num += s[i];
        }
        else {
            if (!num.empty())
                m[stoi(num)] ++; // 숫자 1 증가
            num = "";
        }

    }

    vector <pair<int, int>> map_v(m.begin(), m.end()); //map vector로 변환

    sort(map_v.begin(), map_v.end(), cmp); //size 내림차순으로 정렬

    for (int i = 0; i < map_v.size(); i++) {
        answer.push_back(map_v[i].first);
    }

    return answer;
}

int main() {
    string s = "{{2},{2,1},{2,1,3},{2,1,3,4}}";

    solution(s);

    return 0;
}

 

설명

string s에서 숫자를 찾는다. (연속된 숫자가 끝날 때까지 num에 저장)

숫자를 찾으면 map에서 수(sitring->int 형 변환)의 값을 1씩 증가시킨다.

map 값을 vector 값으로 복사하여 size 순으로 내림차순 정렬한다.

정렬된 vector의 수 firtst를 answer에 push한다. 

 

고찰

걸린시간 : 4~50분

이번 문제에서는 string s에서 숫자를 뽑아내는 것이 가장 관건이었다. stringstream을 사용하여 숫자만을 뽑아내려고 했지만 stringstream은 string과 숫자 함께 섞여있다면 숫자도 string으로 판단하기 때문에 쉽지 않았다. 그래서 문자열 하나하나 숫자인지 판단해서 숫자를 뽑아냈다. 

stringstream, string sub 등 string에 관련된 함수들을 많이 사용해보는 것이 중요할 거 같다. stl에 포함되어 있는 함수를 문제를 풀면서 알아보기는 하지만 구글링없이 완벽하게 사용하기란 불가능하다. 그래서 함수를 많이 사용해보고 연습해보면서 익혀야 할 거 같다. 

728x90

댓글