본문 바로가기
알고리즘/프로그래머스

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

by join5 2023. 8. 31.

문제 이해

문자열이 주어지면 문자열 안에서 튜플을 가려내면 되는 문제.

 

 

 

아이디어 구상

우선 주어진 값을 그대로 사용하기보단 1번 가공해서 사용하는 게 편할 거 같아서 1차적으로 숫자와 , 만 리스트에 담아서 저장했고 그다음 1차원 리스트에 담긴 값을 길이 기준으로 오름차순 정렬했다.

그다음 문자열만큼 반복하면서 문자 -> 숫자로 형태를 변환시키면서 원래 숫자를 만들고 vis로 해당 숫자가 사용 됐는지의 여부를 판별하면서 결과 리스트에 추가했다.(리스트 = 벡터와 같은 의미로 단어를 사용했습니다.)

 

 

 

코드

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
#define MX 100005
int vis[MX];
vector<string> v;

int chk(string a, string b){
    return a.size() < b.size() || (a.size() == b.size() && a < b);
}

vector<int> solution(string s) {
    vector<int> answer;
    string str = "";
    for(int i = 0; s[i]; i++){
        if(s[i] == '{' || s[i] == '"') continue;
        if((s[i] == ',' && s[i-1] == '}') || (s[i] == '}' && s[i-1] == '}')){
            v.push_back(str);
            str = "";
        } else if(s[i] == '}') continue;
        else str += s[i];
    }
    sort(v.begin(), v.end(), chk);
    for(int i = 0; i < v.size(); i++){
        int num = 0;
        for(int j = 0; j < v[i].size(); j++){
            if('0' <= v[i][j] && v[i][j] <= '9') num = num * 10 + (v[i][j] - '0'); 
            else{
                if(!vis[num]){
                    vis[num] = 1;
                    answer.push_back(num);
                }   
                num = 0;
            }
        }
        if(num != 0 && !vis[num]){
            vis[num] = 1;
            answer.push_back(num);
        }
    }
    return answer;
}

댓글