문제 링크 https://programmers.co.kr/learn/courses/30/lessons/68644

문제

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
  • numbers의 모든 수는 0 이상 100 이하입니다.

풀이 과정

이중 for문을 돌려 answer 벡터에 합들을 다 넣어준다.
오름차순으로 정렬하고 중복인 숫자는 erase함수로 제거해준다.

풀이1

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

erase 함수 구현할 때, temp 배열의 크기 설정을 잘 해줘야된다.
numbers 배열의 길이가 100이하이므로, 두 수의 합은 100 * 100 가지의 수므로
10001로 해줘야한다.

풀이2

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> answer;

    vector<int> v;
    for(int i = 0; i < numbers.size() - 1; i++){
        for(int j = i + 1; j < numbers.size(); j++){
            v.push_back(numbers[i] + numbers[j]);
        }
    }
    // sort 오름차순 구현
    for(int i = 0; i < v.size(); i++){
        for(int j = 0; j < v.size(); j++){
            if(v[i] < v[j]){
                int temp = v[i];
                v[i] = v[j];
                v[j] = temp;
            }
        }
    }
    // erase 함수 구현
    int n = 1;
    int temp[10001];
    temp[0] = v[0];
    for(int i = 1; i < v.size(); i++){
        if(v[i] != temp[n - 1]){
            temp[n++] = v[i];
        }
    }
    for(int i = 0; i < n; i++){
        answer.push_back(temp[i]);
    }
    return answer;
}

댓글남기기