벡터 내 두 수를 더해서 나온 수들을 중복없이 벡터로 정렬해서 반환하는 문제를 풀었다.
#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에 없는 수이면 넣기
int sum = numbers[i] + numbers[j];
if(find(answer.begin(), answer.end(),sum) == answer.end())
answer.push_back(sum);
}
}
sort(answer.begin(), answer.end());
return answer;
}
하지만, 다른 사람 풀이를 보니 set으로 간단히 풀 수 있었다.
#include <string>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> answer;
set<int> st;
for(int i = 0;i<numbers.size();++i){
for(int j = i+1 ; j< numbers.size();++j){
st.insert(numbers[i] + numbers[j]);
}
}
answer.assign(st.begin(), st.end());
return answer;
}
set은 중복 없이 값을 넣는다는 것을 이용했다.
push_back은 vector, deque, list와 같은 순차 컨테이너에서만 사용 가능하다. 이런 컨테이너들은 삽입할 위치를 지정할 수 있기 때문에 임의의 위치에 요소를 삽입할 수 있다.
set은 정렬된 컨테이너로, 삽입 시 요소의 위치는 자동으로 결정되며, 중복을 허용하지 않는다. 따라서 순차적으로 값을 추가하는 push_back 대신 insert를 사용해야 한다.
그리고, assign을 사용한 이유를 찾아보니 다음과 같았다.
answer.assign(st.begin(), st.end());는 set에 저장된 값을 vector에 복사하기 위해 사용된 것이다.
set<int> st: 이 set에는 중복되지 않은 값들이 정렬된 상태로 들어간다.
answer.assign(st.begin(), st.end());: assign을 사용하여 set의 요소들을 answer 벡터에 할당한다. 여기서 st.begin()은 set의 첫 번째 요소를 가리키고, st.end()는 마지막 요소를 가리키는 반복자 범위이다. 이 범위 내의 값을 answer에 복사한다.
assign의 역할:
assign은 기존 answer 벡터의 내용을 모두 지우고, 지정한 범위의 값으로 벡터를 초기화한다. 이 코드에서는 set의 내용을 vector로 복사하는 데 사용되었다.