문제
풀이
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <algorithm>
using namespace std;
typedef pair<int, int> ii;
vector<int> solution(string s) {
vector<int> answer;
map<int, int> map;
int n;
// '{', ',' '}' 다 공백으로 replace
for(int i=0; i<s.size(); i++){
if(s[i] == '{' || s[i] == '}' || s[i] == ',')
s[i] = ' ';
}
//숫자 추출
stringstream ss;
ss.str(s);
while(ss >> n){
map[n]++;
}
//벡터를 사용해 map을 value값으로 정렬 ( 튜풀 )
vector<ii> v(map.begin(), map.end());
sort(v.begin(), v.end(), [](ii a, ii b){
return a.second > b.second;
});
for(ii a : v){
answer.push_back(a.first);
}
return answer;
}
튜플
- 중복된 원소가 있을 수 있다. 튜플의 원소를 중복해서 쓰면 다른 튜플이 된다.
예: (1, 2, 3) ≠ (1, 2, 2, 3), 하지만 집합 {1, 2, 3} = {1, 2, 2, 3} - 정해진 순서가 있다. 튜플의 원소의 순서를 바꾸면 다른 튜플이 될 수 있다.
예: (1, 2, 3) ≠ (3, 2, 1), 하지만 집합 {1, 2, 3} = {3, 2, 1} - 튜플의 원소의 개수는 유한하다. 하지만 집합, 중복 집합은 원소 개수가 무한할 수도 있다.
배열의 앞자리에 있을수록 더 많이 사용되기 때문에 key를 숫자로 두고, 숫자가 사용된 횟수를 value로 두어 value값 순으로 정렬했다. 이를 위해 map 자료구조를 사용했다.
stringstream을 사용해 숫자를 추출하기 위해 { , }는 공백으로 변경해주었다.
다른 사람 풀이
#include <bits/stdc++.h>
using namespace std;
vector<int> solution(string s) {
int st[101010]={};
vector<int> answer;
string tmp;
for(char i: s){
if(i-'0' >=0 && i-'0' <=9){
tmp += i;
}
else{
if(tmp.length())
st[stoi(tmp)]++, tmp.clear();
}
}
vector<pair<int, int>> v;
for(int i =0; i <101010; i++)
if(st[i])
v.push_back({st[i], i});
sort(v.begin(), v.end());
reverse(v.begin(),v.end());
for(auto it: v) answer.push_back(it.second);
return answer;
}
많이 나온 수를 pair형식의 구조체를 사용했다.
map과 pair에대해 아직 지식이 부족한것 같아 따로 정리해보았다.
https://strong-2-min.tistory.com/157
'Algorithm > 카카오기출' 카테고리의 다른 글
[프로그래머스(Java)] 성격 유형 검사하기 - HashMap (0) | 2023.07.22 |
---|---|
[프로그래머스] 캐시 (0) | 2022.12.03 |
[프로그래머스] 수식 최대화 / stack (0) | 2022.07.16 |
[프로그래머스] 거리두기 확인하기 (0) | 2022.06.06 |
[프로그래머스] 메뉴 리뉴얼 / substr, 순열과 조합 (0) | 2022.05.16 |