[C++] 프로그래머스 두 개 뽑아서 더하기
2020. 10. 23.
반응형

programmers.co.kr/learn/courses/30/lessons/68644

 

코딩테스트 연습 - 두 개 뽑아서 더하기

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

programmers.co.kr

 

1. 서론 

 

level 1짜리 기본 문제이다. 배열을 이용한 간단한 문제이다.

 

2. 문제 풀이

 

주어진 배열에서 두 가지 숫자를 뽑아 더한 모든 수를 배열에 담아 오름차순으로 정렬하는 문제이다. 

처음에는 뽑기처럼 모든 경우의 수를 따져줘야 하나 했는데 간단한 문제였다. 

복잡하게 풀기 싫어서 그냥 단순하게 풀었다.

주어진 배열을 정렬하고 첫 번째 값을 기준으로 그 뒤의 모든 배열의 값을 더해준다.

그리고 그다음 인덱스의 값도 계속 똑같이 반복해서 더한 값을 저장하는 배열을 만든다.

그리고 모든 계산이 끝나면 이 배열도 정렬하고 중복된 값을 제거해주면 된다.

 

입출력을 예시로 설명해보자.

 

5 0 2 7 -> 0 2 5 7 (정렬)

 

2 5 7 7 9 12 (모든 항을 더한 배열)

 

2 5 7 9 12 (중복 제거)

 

 

3. 코드 설명

 

#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> answer;
    
    sort(numbers.begin(), numbers.end());
    
    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());
    
    int i = 0;
    while(1)
    {
        if (answer.size() - 1 == i) break;
        
        if (answer[i] == answer[i + 1])
        {
            answer.erase(answer.begin() + i);
            i--;
        }
        i++;
    }
    
    return answer;
}

 

주어진 배열을 numbers, 답을 담아야 하는 배열을 answer라고 한다.

numbers를 정렬한 후 두 개의 항을 더한 값을 answer 배열에 저장한다.

answer 배열을 정렬 후 중복을 제거한다.

중복을 제거할 때 answer.erase() 라는 함수를 사용하는데 erase()는 벡터의 해당 인덱스 값을 없애주는 역할을 한다. 

그리고 뒤의 항들을 없어진만큼 한 칸씩 당겨준다.

값을 지웠지만 똑같은 값이 아직 뒤에 더 남아있을 수 있기 때문에 i--를 해서 해당 인덱스 값을 한 번 더 체크해준다. 

중복이 제거 되면 배열을 return 한다.

 

erase를 써본 적이 없어서 좀 어려웠고, 배열의 범위를 앞뒤로 왔다 갔다 하는 걸 신경 써줘야 하는 문제였다.

 

 

 

 

 

 

 

반응형
myoskin