728x90
programmers.co.kr/learn/courses/30/lessons/64065
먼저 입력된 문자열이 집합으로 주어지고, 순서를 무시하고 섞인 값이 들어올 수 있으므로,
각 부분집합이 시작되는 부분(s)과 끝나는 부분(e) 그리고 해당 부분집합이 갖는 숫자의 갯수(cnt)를 담는 벡터
vector<pair<pair<int, int>, int> vec 를 선언하여 담아줬다
그리고 편의상 입력 문자열 str 의 맨앞과 맨뒤의 {, } 를 제거했다.
각 부분집합이 갖는 숫자의 갯수를 오름차순으로 정렬하고 (sort(vec.begin(), vec.end(), comp))
각 부분집합의 숫자 부분만 떼와서 string temp 에 담아 stoi 로 int 형으로 변환하여
answer 에 넣어줬다
이때, answer 에 없는 값이 들어가야 하므로 find() 함수의 결과인 result 가 answer.end() 일때가
answer 에 없는 값이므로, 이때 넣어주게 한다 (가장 처음엔 아무것도 안들어가서 empty 일때는 그냥 넣어준다)
- c++
#include <algorithm>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using namespace std;
bool comp(pair<pair<int, int>, int>& p1, pair<pair<int, int>, int>& p2) {
return p1.second < p2.second;
}
vector<int> solution(string str) {
vector<int> answer;
vector<pair<pair<int, int>, int>> vec; // s, e, cnt
str.erase(0, 1); str.pop_back();
int len = str.length(), cnt = 0, s = 0;
for (int i = 0; i < len; ++i) {
if (str[i] == '{') s = i;
else if ('0' <= str[i] && str[i] <= '9') cnt++;
else if (str[i] == '}') {
vec.push_back(make_pair(make_pair(s, i), cnt));
cnt = 0;
}
}
sort(vec.begin(), vec.end(), comp);
for(int i = 0; i < vec.size(); ++i) {
int start = vec[i].first.first, end = vec[i].first.second;
string temp;
for (int j = start; j <= end; ++j) {
if ('0' <= str[j] && str[j] <= '9') temp.push_back(str[j]);
if (str[j] == ',' || str[j] == '}' && !temp.empty()) {
int num = stoi(temp);
if (answer.empty()) answer.push_back(num);
else {
auto result = find(answer.begin(), answer.end(), num);
if (result == answer.end()) answer.push_back(num);
}
temp = "";
}
}
}
return answer;
}
|
cs |
728x90
'PS' 카테고리의 다른 글
BOJ 1932 - 정수 삼각형 (0) | 2020.12.01 |
---|---|
BOJ 15898 - 피아의 아틀리에 신비한 대회의 연금술사 (0) | 2020.11.30 |
프로그래머스 - 쿼드압축 후 세기 (0) | 2020.11.28 |
BOJ 11559 - Puyo Puyo (0) | 2020.11.26 |
프로그래머스 - 카펫 (0) | 2020.11.25 |