[프로그래머스] 튜플 C++


map과 set을 활용하는 문제

정답제출코드


#include <string>
#include <vector>
#include <map>
#include <set>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    
    string temp = "";
    map<int, string> strs;
    
    int len = s.length();
    
    bool flag = false;
    
    for (int i = 1; i < len-1; ++i)
    {
        if (s[i] == '{')
            flag = true;
        if (flag)
            temp += s[i];
        if (s[i] == '}')
        {
            flag = false;
            strs.insert({temp.length(), temp});
            temp = "";
        }
    }
    
    
    set<int> is_have;
    
    for (auto iter = strs.begin(); iter != strs.end(); ++iter)
    {
        string s_from_iter = iter->second;
        string num = "";
        int len_s = s_from_iter.length();
        
        for (int i = 1; i < len_s-1; ++i)
        {
            if (s_from_iter[i] == ',')
            {
                if (is_have.find(stoi(num)) == is_have.end())
                {
                    answer.push_back(stoi(num));
                    is_have.insert(stoi(num));
                }
                num = "";
                continue;
            }
            num += s_from_iter[i];
        }
        
        if (is_have.find(stoi(num)) == is_have.end())
        {
            is_have.insert(stoi(num));
            answer.push_back(stoi(num));
        }
    }
    return answer;
}

map은 key값에 따라서 자동으로 정렬되는 것을 이용하였다.

튜플의 길이가 작은 것이 우선순위가 높기 때문에 튜플의 길이를 key인자로,

그리고 튜플을 value인자로 map을 설정하였다.

그리고 중복값을 넣지 않기 위해 값을 저장해두는 용도로 is_have라는 set을 설정하였다.


예를 들어, {111}, {20, 111}이 들어왔다면

map에는

  • {1, {111}}
  • {2, {20, 111}}

이 저장된다.

이 때 answer에는 111이 먼저 들어가야 하므로 {111} 부터 정수를 꺼내기 시작한다.

이때, ‘{‘, ‘}’, ‘,’ 을 제외시키고 문자열을 이용해서 숫자만 저장한다음,

stoi함수로 문자열을 정수로 바꿔주었다. 그리고, is_have 세트에 없을 것이므로,

is_have에 111을 추가함과 동시에 answer에도 111을 넣어준다.

한편, 2번째로 {20, 111}에서 20이 먼저 들어올 것이다.

이 때에도 is_have는 20을 가지고 있지 않으므로 is_have에 넣어줌과 동시에 answer에도 20을 넣어준다.

마지막으로 111이 다시 들어올 것이다.

이때에는 is_have에 이미 111이 있으므로 넣어주지 않는다.

이렇게 answer는 {111, 20}이 완성된다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2