[알고리즘 + 자료구조]/[프로그래머스]
프로그래머스 튜플
Hevton
2023. 8. 7. 00:26
반응형
문자열을 자르는게 관건인 문제였다.
#include <string>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int cmp(vector<int>& v1, vector<int>& v2) {
return v1.size() < v2.size();
}
vector<int> solution(string s) {
vector<int> answer;
vector<vector<int>> order;
set<int> ss;
int len = s.length();
vector<int> temp;
string str = "";
for(int i = 0; i < len; i++) {
if('0' <= s[i] && s[i] <= '9') {
str += s[i];
} else if(s[i] == ',' && str.length() > 0) {
temp.push_back(stoi(str));
str = "";
} else if(s[i] == '}') {
if(str.length() > 0)
temp.push_back(stoi(str));
order.push_back(temp);
temp.clear();
str = "";
}
}
sort(order.begin(), order.end(), cmp);
for(auto o : order) {
for(auto x : o) {
if(ss.find(x) == ss.end()) {
ss.insert(x);
answer.push_back(x);
}
}
}
return answer;
}
다른사람들은 어떤 방식을 사용했나 궁금했다.
문자열 나누는 방식은 뭐 거기서 거기였다. 경우의 수를 막기에 급급한..
근데 다른 분의 접근을 보고 새로운 방법을 알게 되었다..
결국 가장 많이 등장한 숫자 순으로 나열해서 리턴해주면 되는 원리였다. 난 왜 생각을 못했지!!
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
int 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;
string tmp = "";
for(auto c : s) {
if('0' <= c && c <= '9') {
tmp += c;
} else if(tmp.length() > 0) {
m[stoi(tmp)]++;
tmp = "";
}
}
vector<pair<int, int>> order(m.begin(), m.end());
sort(order.begin(), order.end(), cmp);
for(auto an : order) {
answer.push_back(an.first);
}
return answer;
}
반응형