Coding Problem/프로그래머스

[프로그래머스/Lv2] - 튜플

마탁이 2021. 6. 29. 16:10

https://programmers.co.kr/learn/courses/30/lessons/64065

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

  • 실제적으로 문자열에서 원하는 데이터를 추출할 수 있는지를 확인하는 문제로 느꼈다.
  • 처음에 [입출력 예] 에서 result가 왜 저렇게 나오는지 이해할 수 없었다.
  • 문제 해결을 위해 s를 각 집합{ ?, ?, ? }를 요소의 개수가 오름차순으로 정렬되어야 한다.
  • 즉, { {4, 2, 3}, { 3 }, { 2,3,4,1 }, { 2,3 } }  라는 예제4 는 {3}, {2, 3}, {4, 2, 3}, {2, 3, 4, 1} 로 정렬한 후 {3} 부터 중복되는 요소없이 answer을 만들어 가면된다.

더보기
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>

using namespace std;

bool cmp(vector<int> lhs, vector<int> rhs)
{
    if (lhs.size() >= rhs.size())
        return false;

    return true;
}

vector<int> solution(string s) 
{
    vector<int> answer;
    
    vector<vector<int>> list;

    // del '{', '}'
    s = s.substr(1, s.size() - 2);
    
    auto sIter = s.begin();
    
    bool isBarket = false;
    vector<int> elementList;
    string numStr;
    while (sIter != s.end())
    {
        if ('{' == *sIter)
        {
            isBarket = true;
        }
        else if ('}' == *sIter)
        {
            isBarket = false;

            int element = atoi(numStr.c_str());
            numStr.clear();
            elementList.push_back(element);

            list.push_back(elementList);
            elementList.clear();
        }
        else if (',' == *sIter)
        {
            if (true == isBarket)
            {
                int element = atoi(numStr.c_str());
                numStr.clear();

                elementList.push_back(element);
            }
            else
            {
                ++sIter;
                continue;
            }
        }
        else
        {
            numStr += *sIter;
        }

        ++sIter;
    }

    // vector's size sort
    sort(list.begin(), list.end(), cmp);

    for (auto vecItem : list)
    {
        for (auto item : vecItem)
        {
            if (answer.end() == find(answer.begin(), answer.end(), item))
                answer.push_back(item);
        }
    }

    return answer;
}


int main()
{
    string s = "{{20,111},{111}}";
    vector<int> answer = solution(s);
    
    // print
    for (auto item : answer)
        printf("%d ", item);

    return 0;
}