문제 설명
정수 배열 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]
C
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define SWAP(x,y,t) ( (t) =(x) , (x) =(y), (y) = (t) )
// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len) {
//추가해줄 리스트 만들기
int cnt = 0; //인덱스
int sum = 0; //element
bool same; //중복
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
int* answer = (int*)malloc(sizeof(int)*numbers_len*(numbers_len-1));
for(int i = 0; i< numbers_len-1; i++){
for (int j= i+1; j < numbers_len; j++){
sum = numbers[i]+numbers[j];
bool same = false;
//중복 제거하기 : answer에 cnt 까지만 넣었으니까 그 전 index까지 돌면서 검사
for(int k=0;k<cnt;k++){
if (answer[k] == sum)
same = true;
}
if (same == false)
answer[cnt++] = sum;
}
}
//입력 여부 확인.
for (int i=0;i<cnt;i++){
printf("%d ",answer[i]);
}
//선택정렬
int least,temp;
for (int i =0 ; i<cnt-1; i++){
least = i;
for (int j=i+1;j<cnt;j++){
if (answer[j]< answer[least]) least = j;
}
SWAP(answer[i] , answer[least], temp);
}
return answer;
}
파이썬
def solution(numbers):
answer = []
cnt = 0
sum = 0
for i in range(0,len(numbers)):
for j in range(i+1,len(numbers)):
sum = numbers[i]+numbers[j]
answer.append(sum)
answer = set(answer)
answer = sorted(answer)
return answe
처음엔 numbers 배열을 오름차순 정렬을 하고 for문을 이중 돌면 작은 것들이 천천히 더해지므로 자연스럽게 answer가 정렬될 줄 알았는데 예시 정답은 맞았지만 제출결과 오류가 났다.
테스트 케이스를 구해서 생각해보니 미리 정렬을 하더라도 셋사이의 간격이 등비수열 간격 이상이면 생각대로 되지 않는다는 것을 알았고, 그냥 중복제거된 수들을 answer에 넣은 후에 정렬시키면 된다.
cnt 는 answer에 넣을 인덱스이다.
그냥 너무 머리가 편하다. 배열 malloc? 포인터? ㅋ 필요없어 그냥 append.
중복제거 bool형 선언? for문 3중 돌기? 그냥 set() 캬
버블정렬? 선택정렬? 퀵 정렬? 그냥 sorted. 아 ...좋다 그냥
뭘할까나