Coding Problem/프로그래머스

[프로그래머스/Lv1] - 두 개 뽑아서 더하기

마탁이 2021. 4. 25. 18:43

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

 

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

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

programmers.co.kr

  • 목록 중에서 한 개씩 뽑고 같은 index가 아니라면 더하는 것이다. 중복제거 또한 해야함
  • <algorithm>을 써도 되지만 문제가 C만을 사용해서 쓰라는 것 같길래 for()문 2개를 활용한 오름차순 정렬을 사용했는데, 통과가 된다. 실제적으로 속도를 높이며련 퀵 정렬, 합병 정렬, 힙 정렬을 쓰자.

더보기
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define MAX_LEN 990000

int buff[MAX_LEN + 1] = { 0, };
int* solution(int numbers[], size_t numbers_len) {
    
    int buffIdx = 0;
    for (int lhsIdx = 0; lhsIdx < numbers_len; lhsIdx++)
    {
        const int lhs = numbers[lhsIdx];
        for (int rhsIdx = 0; rhsIdx < numbers_len; rhsIdx++)
        {
            if (lhsIdx == rhsIdx)
                continue; 

            const int rhs = numbers[rhsIdx];
            const int sum = lhs + rhs;
            
            // check
            bool bIsExisted = false;
            for (int idx = 0; idx < buffIdx; idx++)
            {
                if (sum == buff[idx]) 
                {
                    bIsExisted = true;
                    break;
                }
                    
            }
            if (false == bIsExisted)
            {
                buff[buffIdx] = sum;
                buffIdx++;
            }
        }
    }

    // sort
    for (int lhs = 0; lhs < buffIdx; lhs++)
    {
        for (int rhs = 0; rhs < buffIdx; rhs++)
        {
            if (buff[lhs] < buff[rhs])
            {
                int temp = buff[lhs];
                buff[lhs] = buff[rhs];
                buff[rhs] = temp;
            }
        }
    }

    int* answer = (int*)malloc(sizeof(int) * (buffIdx));
    answer = buff;

    return answer;
}


int main()
{
    int numbers[] = { 5,0,2,7 };
    int numbers_len = sizeof(numbers) / sizeof(int);
    int* ans = solution(numbers, numbers_len);

    return 0;
}