Coding Test/programmers
[프로그래머스] 두 개 뽑아서 더하기 c++
owls
2022. 9. 13. 13:51
728x90
문제 설명
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
제한 사항
- numbers의 길이는 2 이상 100 이하입니다.
- numbers의 모든 수는 0 이상 100 이하입니다.
입출력 예
numbers | result |
[2,1,3,4,1] | [2,3,4,5,6,7] |
[5,0,2,7] | [2,5,7,9,12] |
풀이
순열을 사용한 조합 구하는 방법을 사용했습니다.
nCr = numbers.size() C 2
조합을 구하기 위해서 보조 수열이 필요합니다.
1.보조 수열은 numbers사이즈 크기로 생성하고, 0으로 초기화 합니다.
2. 2개만 뽑아야 하니, 보조 수열의 맨 뒤에서 부터 2개의 원소를 1로 변경합니다.
3.결과 값을 저장하는 벡터의 오름차순 정렬, 중복 제거를 마지막에 적용시킵니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> answer;
int len = numbers.size();
vector<int> visit(len, 0);
visit[len-1] = 1;
visit[len-2] = 1;
int sum = 0;
do{
for(int i = 0; i < len; i++){
if(visit[i] != 0){
sum += numbers[i];
}
}
answer.push_back(sum);
sum = 0;
}while(next_permutation(visit.begin(), visit.end()));
sort(answer.begin(), answer.end());
answer.erase(unique(answer.begin(), answer.end()), answer.end());
return answer;
}
다른 방법
중복을 허용하지 않는 set을 사용하여
이중 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;
}
728x90