프로그래머스 튜플 문제 링크
리뷰
입력이 문자열로 주어지는데, 괄호와 콤마가 섞인 숫자가 있는 문자열이다.
"{{2},{2,1},{2,1,3},{2,1,3,4}}"
문자열 내에 숫자 그룹이 4개다. 이걸 4개의 그룹으로 구분해야 한다고 생각해서 2차원 벡터를 선언했다.
그런데 풀다보니 map으로 각 숫자의 개수를 센다. -> 2 4개, 1 3개, 3 2개, 4 1개
개수가 많은 숫자부터 출력하면 답이 된다.
sort() 함수에 비교함수 cmp 를 넣어서 pair.second 개수를 기준으로 내림차순 정렬을 했다.
따로 2차원 벡터로 구분할 필요가 없어서 두 번째 코드는 int 배열에 모든 숫자를 넣고 map으로 숫자의 개수를 셌다.
"맞았습니다" 코드 1
#include <string>
#include <vector>
#include <map>
#include <algorithm>
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> tuple_map; // {숫자, 숫자의 개수}
int slen = s.size();
// 2차원 벡터 선언
vector<vector<int>> v(500, vector<int>());
int v_num = 0; // {그룹 번호 == 벡터의 행 번호 }
string s_num;
for(int i = 1; i < slen-1; i++){
if(isdigit(s[i])) s_num += s[i]; // 숫자라면, s_num 문자열에 이어붙인다.
else if(!s_num.empty()){ // 숫자가 아닌게 나오면 벡터에 푸시하고 문자열 초기화
v[v_num].push_back(stoi(s_num));
s_num = "";
if(s[i] == '}') v_num++; // 닫는 괄호 }가 나오면, 그룹 하나가 끝난거니까 벡터의 행을 증가시킴
}
}
for(int i = 0; i < v_num; i++){ // 숫자 마다의 개수를 센다
for(int j = 0; j < v[i].size(); j++){
tuple_map[v[i][j]]++;
}
}
vector<pair<int,int>> pv(tuple_map.begin(), tuple_map.end());
sort(pv.begin(), pv.end(), cmp); // '개수'기준으로 내림차순 정렬
for(int i = 0; i < pv.size(); i++) answer.push_back(pv[i].first);
return answer;
}
"맞았습니다" 코드 2
#include <string>
#include <vector>
#include <map>
#include <algorithm>
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;
string s_num;
for(char ch : s){
if(isdigit(ch)) s_num += ch; // 숫자라면, s_num 문자열에 이어붙인다.
else if(!s_num.empty()){ // 숫자가 아닌게 나오면 벡터에 푸시하고 문자열 초기화
answer.push_back(stoi(s_num));
s_num = "";
}
}
map<int,int> tuple_map;
for(int i = 0; i < answer.size(); i++){
tuple_map[answer[i]]++;
}
answer.clear();
vector<pair<int,int>> pv(tuple_map.begin(), tuple_map.end());
sort(pv.begin(), pv.end(), cmp);
for(int i = 0; i < pv.size(); i++) answer.push_back(pv[i].first);
return answer;
}