코딩테스트/문제풀이

[220808] Level1_ 두 개 뽑아서 더하기

Honey Badger 2022. 8. 8. 17:37

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이법

STL의 컨테이너인 Set이 중복을 허용하지 않으면서 자동정렬된다는 점을 이용해 문제를 쉽게 해결할 수 있었다. 이중 for문은 옛날에 많이 했던 별피라미드 알고리즘과 유사하다. 

#include <string>
#include <vector>
#include <set>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> answer;
    set<int> result;
    int num = numbers.size();
    for (int i = 0; i < num; i++)
    {
        if (i != num - 1)
        {
            for (int k = i + 1; k < num; k++)
            {
                result.insert(numbers[i] + numbers[k]);
            }
        }      
    }
    for (int i : result)
    {
        answer.push_back(i);
    }
    return answer;
}

보완점

굳이 이중for문안에 if문을 넣어줄 이유가 없었다. 마지막 계산을 하지 않겠다는 의도였으나 해도 무방하므로 가독성을 위해 지운다. 또한 마지막 for문을 통해 set에서 vector로 값을 복사해주는 것이 나오는데 다른풀이를 보니 vector의 메소드인 assign을 이용하면 for문을 쓰지 않고 쉽게 복사가 가능하다.

#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;
}