[문제]
코딩테스트 연습 - 튜플 | 프로그래머스 스쿨 (programmers.co.kr)
[문제 풀이]
vector<int> total[n]과 split 함수만 있다면 쉽게 구현이 가능한 문제이다.
vector<int> total[n]에서 n은 해당 벡터의 사이즈 크기로 {2}는 사이즈가 1이니 vector<int> total[1]에 저장시키고 {2,3}은 vector<int> total[2]에 저장시키자.
즉, split 함수를 이용해서 int 벡터에 {} 안에 있는 숫자들을 모두 저장시키고 해당 벡터를 total에 저장만 시키면 생각보다 금방 끝난다.
자세한 사항은 코드 참고.
[회고]
구현문제로 만드는데 어렵게 접근을 해서 도중에 시간 낭비가 30분 넘게 생겼었다.
find에서 찾을때 answer안에만 없으면 되는데 도중에 total안에 없어야 되지 않냐고 착각을 해서 시간 낭비를 또 30분 했었다....
난이도 자체가 어렵진 않으니 언제나 주의만 하면 쉽게 풀 수 있다.
[코드]
#include <string>
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <sstream>
using namespace std;
vector<int> total[100001];
string str;
int max_point;
void split(string s){
string buffer;
vector<int> answer;
istringstream iss(s);
char delimeter = ',';
int result = 0;
while(getline(iss,buffer,delimeter)){
answer.push_back(stoi(buffer));
result++;
}
total[result] = answer;
max_point = max(max_point,result);
return;
}
vector<int> solution(string s) {
vector<int> answer;
int startPoint;
for(int i = 1;i<s.size() - 1;i++){
if(s[i] == '{'){
startPoint = i;
}
else if(s[i] == ','){
}
else if(s[i] == '}'){
// str = substr()으로 시작인덱스 ,끝 인덱스 파악.
//split으로 나누자.
string temp;
temp = s.substr(startPoint + 1,i - startPoint - 1);
split(temp);
}
}
//1. vector<int > total[] 에서 뒤의[i] 에서 i는 크기를 의미.
//2. answer안에 아직 저장된적이 없다면 넣자.
vector<int>::iterator it;
for(int i = 1;i<=max_point;i++){
for(int j = 0;j<total[i].size();j++){
it = find(answer.begin(),answer.end(),total[i][j]);
if(it == answer.end()){
answer.push_back(total[i][j]);
}
}
}
return answer;
}