01.두 개 뽑아서 더하기

Rio·2020년 10월 12일
0

코딩테스트

목록 보기
1/3

- 문제 이해

정수 배열이 주어졌을 때, 서로 다른 두개의 인덱스를 뽑아 만들 수 있는 수를 배열의 오름차순으로 반환하는 문제이다.

  • pseudo code

    def sum():
    	# get num array //vector<int> numbers
    	# get sum array //loop all index
    	# input sum result into anwer array //중복 고려x 
    	# 결과 배열을 정렬하고 중복 제거
  • 문제점

    입력 배열의 길이가 최대값이 100이고 길이 또한 100이하이므로 2개를 모든 인덱스를 합하여도 문제되지 않는다.

    그러나 정렬을 하고 중복된 값을 제거하는 것이 관건이였다.

    그러다 찾게 된 것이 unique() 함수였다.

    • unique()

      algorithm헤더 파일에 있는 함수로, vector배열에서 중복되지 않는 원소들을 앞에서부터 채워나가는 함수이다. 
      주의사항으로는 unique함수는 앞과 뒤의 원소들을 비교하기 때문에 반드시 정렬을 한 뒤 실행해야한다. sort()실행
      함수를 실행하고 나면 중복 요소들은 뒤로 밀려나고, 중복이 없는 부분까지의 end()부분을 반환한다.
      즉, 뒤로 밀려난 중복요소들의 시작 부분의 주소를 반환한다.
      그리고 erase()함수를 통해 중복을 지워준다.

      unique(vec.begin(),vec.end()) //주소를 반환

    • erase()

      vector헤더 파일에 존재

      인자로 주소값들을 받아 그 구간을 삭제한다

      vec.erase(vec.begin(),vec.end())

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

- 정리

나와 다른 풀이로는 미리 연산의 합을 저장하는 길이 200의 배열을 생성하고 sum의 결과를 체크해 중복을 처음부터 피하는 방식이 있었다.

python은 중복제거나 중복점검을 하는게 쉽게 가능하던데 c++에서는 unique라는 함수가 있으니 잘 활용해야겠다.

profile
우당탕탕 개발 기록지

0개의 댓글