Coding_Test_C++

Programmers Level 2: 2019 카카오 개발자 겨울 인턴십 튜플(C++)

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

풀이법

1) 문자열을 활용한 정렬과 구현 문제이다.

2) 2차원 정수형 배열을 만들고 { } 사이에 있는 값들을 다 일일이 넣어주었다. 이때 가장 바깥쪽 대괄호는 생략하였다.

        if(s[i]=='{')
        {            
            s1="";
            check=true;
        }
        else if(s[i]=='}'){
            temp[j].push_back(stoi(s1));
            j++;
            check=false;
        }
        else if(s[i]==',' && check==true)
        {
            temp[j].push_back(stoi(s1));
            s1="";
        }
        else if(check==true && s[i]!=',')
        {
            s1+=s[i];
        }

각각의 경우의 수를 코딩해 주었으며, 쉼표나 대괄호가 닫히는 경우 지금껏 받았던 문자열을 stoi함수를 사용하여 2차원 배열인 temp에 넣어주었다. 대괄호가 닫히는 경우 2차원 배열 temp[j][x] 의 j index를 증가시켜주었다.

 

3) 이후 sort 함수를 이용하여 들어간 2차원 배열 안에서 1차원 배열의 크기로 오름차순 정렬을 시켜 주었다.

(가장 짧은 1차원 배열이 2차원 배열의 0 번 index에 존재하도록 코딩하였다.)

 

4) 이후 visited 라는 bool 배열을 활용하여, 2차원 배열을 탐색했으며 visited 배열에 담겨있지 않은 새로운 값이 나오는 경우 최종 결과 값인 answer 배열에 추가 시켜 주었다.

 

#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

bool visited[100001];
bool compare(vector<int> a, vector<int> b)
{
    if(a.size()<b.size())
        return true;
    else
        return false;
}
vector<int> solution(string s) {
    vector<int> answer;
    vector<vector<int>> temp(501);
    string s1="";
    int j=0;
    bool check=false;
    for(int i=1; i<s.size()-1;i++)
    {
        if(s[i]=='{')
        {            
            s1="";
            check=true;
        }
        else if(s[i]=='}'){
            temp[j].push_back(stoi(s1));
            j++;
            check=false;
        }
        else if(s[i]==',' && check==true)
        {
            temp[j].push_back(stoi(s1));
            s1="";
        }
        else if(check==true && s[i]!=',')
        {
            s1+=s[i];
        }
    }
    sort(temp.begin(),temp.end(),compare);
    for(int i=0; i<temp.size();i++)
    {
        for(int j=0; j<temp[i].size();j++)
        {
            if(!visited[temp[i][j]])
            {
                visited[temp[i][j]]=true;
                answer.push_back(temp[i][j]);
            }
        }
    }
    return answer;
}