새벽코딩

[프로그래머스] 최솟값 만들기 (JAVA) (level2) 본문

알고리즘

[프로그래머스] 최솟값 만들기 (JAVA) (level2)

J 코딩 2023. 8. 4. 15:55
반응형

※https://school.programmers.co.kr/learn/courses/30/lessons/12941

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)

예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면

  • A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
  • A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
  • A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)

즉, 이 경우가 최소가 되므로 29를 return 합니다.

배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 배열 A, B의 크기 : 1,000 이하의 자연수
  • 배열 A, B의 원소의 크기 : 1,000 이하의 자연수

※ JAVA 코드 (최솟값 만들기)

import java.util.*;

class Solution
{
    public int solution(int []A, int []B)
    {
        int answer = 0;

        Arrays.sort(A);
        Arrays.sort(B);

        for(int i = 0; i < A.length; i++){
            answer += A[i] * B[B.length - i - 1];
        }

        return answer;
    }
}

 


※ 생각정리 (최솟값 만들기)

먼저, 이 문제는 정답이 조금 이상하다 같은 소스로 어떨때는 통과, 어떨때는 실패를 하는 문제이기 때문이다.

 

처음 문제를 풀때 Array A는 정렬, Array B는 역정렬 하여 서로의 값을 곱했더니 시간초과가 나왔다. (사실 5번 돌려서 4번은 시간초과 1번은 성공이 나왔다)

정렬, 역정렬 사용

 

두번째로는 두 Array를 모두 정렬하여 인덱스를 조정해서 값을 구했더니 훨씬 빠른 속도를 냈다.

정렬 두개 사용

 

primitive type 변수들은 Arrays.sort()를 사용할 수 있으며 이는 퀵소트를 기반으로 작동된다. 따라서 다른 버블정렬, 선택정렬등에 비해 바른 속도를 낸다. (병합정렬은 상황에 따라 다를 수 있다) 

 

[잠깐 내림차순정렬에 대하여]

primitive type 변수는 내림차순 정렬을 제공하고 있지 않으므로 boxing 과정을 통해 Integer array로 변형하여 정렬하여야한다.

// boxing
Integer[] arr = Arrays.stream(a).boxed().toArray(Integer[]::new);
// 내림차순 정렬
Arrays.sort(arr, Comparator.reverseOrder());

 

아마 이 Integer array를 정렬하는 시간이 단순 int array를 정렬하는 시간에 비해 속도가 느린것으로 생각된다.

 

-새벽코딩-

반응형
Comments