N

(프로그래머스 c++ KAKAO)튜플 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)튜플

naeunchan 2020. 5. 26. 11:05
728x90
반응형

문자열을 int형으로 바꿔서 문제를 풀어야 한다.

 

우선 괄호와 ',' 때문에 조건을 많이 걸어야 했다.

2차원 int형 벡터 v와 1차원 int형 벡터 num, string을 int로 변환하기 위한 임시 변수 tmp가 핵심이다.

 

for문은 1 ~ s.size() - 1까지 반복하도록 하였다.

s의 맨 처음 괄호와 맨 끝 괄호는 고려하지 않아도 되기 때문이다..!

튜플을 구분하기 위한 괄호를 이용하여 flag를 썼다.

 

if(open == false && s[i] == '{')

   open = true;

각 튜플이 시작되면 open을 true로 바꿔주었다.

이후 '}'가 나올 때까지 해당 튜플의 수를 int로 바꿔준다.

s[i]가 숫자라면 tmp에 넣어주면 된다.

만약 s[i]가 ','가 나온다면 tmp를 stoi()를 이용하여 int형으로 바꿔주고, 바꾼 값을 num에 넣어준다.

 

그러다가 '}'를 만나게 되면 v 벡터에 num 벡터를 넣어주면 해당 튜플은 끝이나고 다음 튜플을 구하도록 변수들을 초기화 한다.

open = false, tmp = "", num.clear() 하여 모든 값을 초기화 시켜주고 모든 튜플을 구할 때까지 반복한다..!

 

for문이 끝나면 이제 답을 구해야 한다.

v 벡터에 들어있는 각 벡터들을 size의 오름차순으로 변경해줘야 한다.

그래야 원하는 답을 얻을 수 있기 때문이다.

그러기 위해서 asc() 함수를 정의하였다.

 

정렬된 v벡터를 순회하여 check를 하자.

만약 check[v[i][j]]가 false라면 중복이 아니므로

answer에 v[i][j]를 넣어주고 check[v[i][j]] = true로 바꿔주면 된다..!

 

문제는 길지만 차근차근 풀다보면 쉽게 풀 수 있다..!

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool asc(vector<int> a, vector<int> b)
{
    return a.size() < b.size();
}

vector<int> solution(string s) {
    vector<int> answer;
    bool check[100001] = {false, }, open = false;
    vector<vector<int>> v;
    vector<int> num;
    string tmp = "";
    
    for(int i = 1; i < s.size() - 1; i++)
    {
        if(open == false && s[i] == '{')
            open = true;
        else if(open == true && (s[i] >= '0' && s[i] <= '9'))
        {
            tmp.push_back(s[i]);
        }
        else if(open == true && s[i] == ',')
        {
            int t = stoi(tmp);
            num.push_back(t);
            tmp = "";
        }
        else if(open == true && s[i] == '}')
        {
            int t = stoi(tmp);
            num.push_back(t);
            v.push_back(num);
            open = false;
            tmp = "";
            num.clear();
        }
    }
    
    sort(v.begin(), v.end(), asc);
    
    for(int i = 0; i < v.size(); i++)
    {
        for(int j = 0; j < v[i].size(); j++)
        {
            if(check[v[i][j]] == false)
            {
                check[v[i][j]] = true;
                answer.push_back(v[i][j]);
            }
        }
    }
    return answer;
}
728x90
반응형