문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/64065
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제는 특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 구하는 문제이다.
처음에 문제를 접했을 때 단순히 문자열 s에 들어있는 숫자를 구한 뒤 이를 나열하면 되는 줄 알았는데 튜플의 원소 순서에 따라서 튜플이 달라지기 때문에 원소 순서도 고려해야 하는 문제였다. 한 튜플의 여러 집합에서 많은 개수를 가진(자주 등장한) 원소가 앞에 나열되어야 한다.
따라서 다른 블로그를 참고하였는데 map을 이용한 풀이가 간단하고 편리해 보였다.
map은 key와 value를 갖는 자료구조로 key에 튜플의 원소를 담아두고 원소의 개수를 value로 삼아 원소의 개수를 기준으로 내림차순 정렬을 하여 마지막에는 key만 answer 벡터에 push하는 방법이었다.
위 원리에 따른 코드는 아래와 같다.
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
bool cmp(pair<int,int> a, pair<int,int> b) {
return a.second > b.second;
}
vector<int> solution(string s) {
vector<int> answer;
map<int, int> m; // map<key,value> key->begin, value->end
string tmp;
for (int i = 1; i < s.length() - 1; i++){
if (s[i] != '{' && s[i] != '}' && s[i] != ',') {
tmp += s[i];
if (s[i+1] != ',' && s[i+1] != '}') // 이어진 숫자인 경우(ex. 123)
continue;
// map으로 해당 숫자의 개수를 카운팅
m[stoi(tmp)]++;
}
tmp = "";
}
// value 기반 정렬
vector<pair<int,int>> vec(m.begin(), m.end());
sort(vec.begin(), vec.end(), cmp);
// vec벡터의 처음부터 끝까지 answer벡터에 push
for (pair<int,int> pairNum : vec)
answer.push_back(pairNum.first);
return answer;
}
참고: https://0xd00d00.github.io/2021/08/22/programmers_touple.html