programmers.co.kr/learn/courses/30/lessons/68644
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를 써본 적이 없어서 좀 어려웠고, 배열의 범위를 앞뒤로 왔다 갔다 하는 걸 신경 써줘야 하는 문제였다.
'Algorithm' 카테고리의 다른 글
[C++] 프로그래머스 모의고사 (0) | 2020.10.26 |
---|---|
[C++] 프로그래머스 완주하지 못한 선수 (0) | 2020.10.25 |
[C++] 백준 1541 잃어버린 괄호 (0) | 2020.07.31 |
[C++] 백준 11399 ATM (0) | 2020.07.29 |
[C++] 백준 1931 회의실배정 (+ JAVA 코드 추가) (0) | 2020.07.27 |