알고리즘 공부(C++)

[C++]프로그래머스 튜플

혀니리리 2023. 10. 24. 13:33
728x90

코딩테스트 연습 - 튜플 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;

bool cmp(pair<int,int> &a, pair<int, int> &b)
{
    if (a.second == b.second) return a.first > b.first;
	return a.second > b.second;
}

vector<int> solution(string s) {
    vector<int> answer;
    map<int, int> mp;
    int i = 0;
    int now = 0;
    while(s[i])
    {
        if('0' <= s[i] && s[i] <= '9')
        {
            now = i;
            for(int j = i; j < s.size(); j++)
            {
                if(s[j] == ',' || s[j] == '}')
                {
                    mp[stoi(s.substr(now, j))]++;
                    i = j;
                    break;
                }
            }
        }
        else i++;
    }
    vector<pair<int, int>>vec(mp.begin(), mp.end());
    sort(vec.begin(), vec.end(), cmp);
    for(auto num:vec)
        answer.push_back(num.first);
    return answer;
}

문풀 방식

우선 튜플이 정렬되는 방식이 가장 많이 등장하는 숫자부터 vector에 정렬되어야 했다.

그러려면 등장하는 횟수를 저장해야 했는데 그럴때는 역시 map이 좋다.

 

while문으로 문자열을 훑으면서 숫자가 나올 경우 인덱스를 증가시켜 }이나 ,이 나올 때까지 받고 난 후에

그 때까지의 문자열을 자르고 stoi로 int형 정수로 변환하여 map에서 해당 값을 증가시켰다.

이렇게 map이 다 생성되고 난 후에는 

<int, int>라는 형태의 배열에 맵의 처음부터 끝까지 그대로 집어넣는다.

그리고 cmp라는 함수로 second기준으로 정렬하여 sort하고

그 이후에 마지막으로 만들어진 vec의 first값들을 차례대로 answer벡터에 넣어주었다.

728x90