set<>

Subin·2024년 9월 17일

Algorithm

목록 보기
38/69

벡터 내 두 수를 더해서 나온 수들을 중복없이 벡터로 정렬해서 반환하는 문제를 풀었다.

[내 풀이]

#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로 복사하는 데 사용되었다.

profile
성장하며 꿈꾸는 삶을 살아가고 있는 대학생입니다😊

0개의 댓글