안녕하세요. 이번 포스팅에서는 Programmers 튜플 문제를 해결해보도록 하겠습니다.
해당 문제는
https://programmers.co.kr/learn/courses/30/lessons/64065
위 링크에서 확인하실 수 있습니다.
문자열 단순 구현 문제입니다. 문제의 요구조건을 다음의 과정을 통해 해결하였습니다.
"{{1,2,3},{2,1},{1,2,4,3},{2}}"
이러한 입력이 주어졌을 때 두 번의 parsing을 거쳐 분해하였습니다.
{1,2,3}
{2,1}
{1,2,4,3}
{2}
->
[1, 2, 3]
[2, 1]
[1, 2, 4, 3]
[2]
이제 위의 정보를 통해 리스트를 길이에 따라 오름차순으로 정렬해준 뒤,
->
[2]
[2, 1]
[1, 2, 3]
[1, 2, 4, 3]
순서대로 순회하며, 결과에 추가해주었습니다.
<소스 코드>
#include <bits/stdc++.h>
using namespace std;
vector<int> parsing(string s) {
vector<int> ret;
string tmp = "";
for(int i = 0; i < s.size(); i++) {
if(s[i] >= '0' && s[i] <= '9') tmp+=s[i];
else {
if(tmp.size()) ret.push_back(stoi(tmp));
tmp.clear();
}
}
return ret;
}
vector<vector<int>> tokenize(string s) {
vector<vector<int>> ret;
vector<string> toTokenize;
string res = "";
for(int i = 0; i < s.size(); i++) {
if(s[i] == '}') {
res+=s[i];
toTokenize.push_back(res);
res.clear();
i++;
} else res+=s[i];
}
for(auto t : toTokenize) ret.push_back(parsing(t));
return ret;
}
bool cmp(vector<int>& a, vector<int>& b) { return a.size() < b.size(); }
vector<int> solution(string s) {
vector<int> answer;
s = s.substr(1, s.size()-2);
vector<vector<int>> token = tokenize(s);
sort(token.begin(), token.end(), cmp);
vector<bool> visited (100004, 0);
for(int i = 0; i < token.size(); i++) {
for(int j = 0; j < token[i].size(); j++) {
int cur = token[i][j];
if(!visited[cur]) {
visited[cur] = 1;
answer.push_back(cur);
}
}
}
return answer;
}
*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 행렬 테두리 회전하기 (0) | 2021.10.05 |
---|---|
[Programmers] 모두 0으로 만들기 (0) | 2021.10.05 |
[Programmers] 위클리 챌린지 7 (0) | 2021.09.23 |
[Programmers] 보석 쇼핑 (0) | 2021.09.10 |
[Programmers] 단어 변환 (0) | 2021.09.07 |