Study/Algorithm
프로그래머스 (C/C++) 64065 : 튜플
hwooo
2024. 11. 20. 01:22
https://school.programmers.co.kr/learn/courses/30/lessons/64065
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr



풀이
입력된 문자열을 '{', '}' 기준으로 나누고, 그 문자열을 ',' 기준으로 나누며 숫자로 변환한다.
이렇게 나눠진 숫자 배열들을 길이 순으로 정렬하여 앞에서부터 탐색한다. 이 때 나온 값인지 확인하여 나오지 않은 값이면 answer 배열에 저장하며 답을 만든다.
코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// , 기준으로 파싱 및 숫자 변환
vector<int> strToNumList(string s) {
vector<int> nums;
int start = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == ',') {
nums.push_back(stoi(s.substr(start, i - start)));
start = i + 1;
}
}
nums.push_back(stoi(s.substr(start)));
return nums;
}
// {} 기준으로 문자열 파싱
vector<vector<int>> divideStr(string s) {
vector<vector<int>> v;
int start = 2, end = 2;
while (end < s.size()) {
while (end < s.size() && s[end++] != '}');
v.push_back(strToNumList(s.substr(start, end - start - 1)));
start = end + 2;
end = start;
}
return v;
}
bool cmp(vector<int> a, vector<int> b) { return a.size() < b.size(); }
vector<int> solution(string s) {
vector<int> answer;
vector<vector<int>> v = divideStr(s);
// 문자열 길이 기준으로 정렬
sort(v.begin(), v.end(), cmp);
// 나온 값인지 체크하며 답 반환
bool visited[100'001] = {0, };
for (vector<int> nums : v) {
for (int n : nums) {
if (visited[n]) continue;
answer.push_back(n);
visited[n] = true;
}
}
return answer;
}