정수 배열이 주어졌을 때, 서로 다른 두개의 인덱스를 뽑아 만들 수 있는 수를 배열의 오름차순으로 반환하는 문제이다.
pseudo code
def sum():
# get num array //vector<int> numbers
# get sum array //loop all index
# input sum result into anwer array //중복 고려x
# 결과 배열을 정렬하고 중복 제거
문제점
입력 배열의 길이가 최대값이 100이고 길이 또한 100이하이므로 2개를 모든 인덱스를 합하여도 문제되지 않는다.
그러나 정렬을 하고 중복된 값을 제거하는 것이 관건이였다.
그러다 찾게 된 것이 unique() 함수였다.
unique()
algorithm헤더 파일에 있는 함수로, vector배열에서 중복되지 않는 원소들을 앞에서부터 채워나가는 함수이다.
주의사항으로는 unique함수는 앞과 뒤의 원소들을 비교하기 때문에 반드시 정렬을 한 뒤 실행해야한다. sort()실행
함수를 실행하고 나면 중복 요소들은 뒤로 밀려나고, 중복이 없는 부분까지의 end()부분을 반환한다.
즉, 뒤로 밀려난 중복요소들의 시작 부분의 주소를 반환한다.
그리고 erase()함수를 통해 중복을 지워준다.unique(vec.begin(),vec.end()) //주소를 반환
erase()
vector헤더 파일에 존재
인자로 주소값들을 받아 그 구간을 삭제한다
vec.erase(vec.begin(),vec.end())
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> answer;
for(int i = 0 ; i < numbers.size()-1;i++){
for(int j = i+1 ; j<numbers.size();j++){
answer.push_back(numbers[i]+numbers[j]);
}
}
//정렬을 통해 오름차순
sort(answer.begin(), answer.end());
//중복을 제거
answer.erase(unique(answer.begin(), answer.end()),answer.end());
return answer;
}
나와 다른 풀이로는 미리 연산의 합을 저장하는 길이 200의 배열을 생성하고 sum의 결과를 체크해 중복을 처음부터 피하는 방식이 있었다.
python은 중복제거나 중복점검을 하는게 쉽게 가능하던데 c++에서는 unique라는 함수가 있으니 잘 활용해야겠다.