기계는 거짓말하지 않는다

[Programmers] 튜플 본문

Programming Test

[Programmers] 튜플

KillinTime 2021. 4. 27. 16:59

프로그래머스 - 튜플 문제입니다.

 

문제

양쪽의 중괄호를 먼저 제거하고, 다음 중괄호 안의 원소만 ,를 포함해서 string 벡터에 담아야겠다는 생각을 했습니다.

원소 수가 적은 집합을 오름차순으로 정렬 후 중복되지 않게 차례대로 정답 벡터에 추가합니다.

 

,를 기준으로 끊어 number를 확인 합니다. 중복 확인은 unordered_set 을 사용했습니다.

마지막에는 ,가 없으므로 배열 길이의 마지막에 도달하면 number를 한번 더 확인합니다.

 

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

using namespace std;

bool cmp(string a, string b) {
    return a.length() < b.length();
}

vector<int> solution(string s) {
    vector<int> answer;
    vector<string> tuples;
    unordered_set<int> set;
    int i, j, num;
    string temp = "";
    
    s = s.substr(1, s.length() - 2);	// 양쪽 중괄호 제거
    for(i = 0; i < s.length(); i++) {
        if(s[i] == '}') {
            tuples.push_back(temp);	// 중괄호 안의 원소 ,포함 저장
            temp = "";
        }
        else if(s[i] != '{') {
            if(temp == "" && s[i] == ',') continue;	// 중괄호 사이의 ,는 무시
            else temp += s[i];
        }
    }

    sort(tuples.begin(), tuples.end(), cmp);	// 길이 순 오름차순 정렬
    
    temp = "";
    for(i = 0; i < tuples.size(); i++) {
        for(j = 0; j < tuples[i].length(); j++) {
            if(tuples[i][j] != ',') temp += tuples[i][j];	// ,가 아닐경우 원소
            if(tuples[i][j] == ',' || j == tuples[i].length() - 1) {	// 현재 문자가 ,거나 마지막 원소일 때
                num = stoi(temp);
                if(set.find(num) == set.end()) {	// 중복되지 않은 원소
                    set.insert(num);	// set에 추가
                    answer.push_back(num);	// 정답에 추가
                }
                temp = "";
            }
        }
    }
    return answer;
}

'Programming Test' 카테고리의 다른 글

[Programmers] 이진 변환 반복하기  (0) 2021.04.30
[Programmers] 캐시  (0) 2021.04.30
[Programmers] 124 나라의 숫자  (0) 2021.04.29
[Programmers] 야근 지수  (0) 2021.04.26
[Programmers] 단어 변환  (0) 2021.04.25
Comments