본문 바로가기

Algorithm/카카오기출

[프로그래머스] 튜플 / map

문제

 

풀이

#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

 

[자료구조] Pair 와 Map

Pair 두 객체를 하나의 객체처럼 다룰 수 있게 해주는 구조체 선언  pair p ( first, second); 생성 p = make_pair( first , secnod ); 데이터 접근 p.first; p.second; Map #include 선언이 필요하다. pair로 된..

strong-2-min.tistory.com