개발하는 두더지

[프로그래머스] 최소값 만들기 - Level 2 본문

알고리즘

[프로그래머스] 최소값 만들기 - Level 2

덜지 2018. 4. 10. 13:50

https://programmers.co.kr/learn/challenge_codes/180


자연수로 이루어진 길이가 같은 수열 A,B가 있습니다. 최솟값 만들기는 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱한 값을 누적하여 더합니다. 이러한 과정을 수열의 길이만큼 반복하여 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다.

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

  1. A에서 1, B에서 4를 뽑아 곱하여 더합니다.
  2. A에서 2, B에서 3을 뽑아 곱하여 더합니다.

수열의 길이만큼 반복하여 최솟값 10을 얻을 수 있으며, 이 10이 최솟값이 됩니다.
수열 A,B가 주어질 때, 최솟값을 반환해주는 getMinSum 함수를 완성하세요.


package com.example.lib;

public class myClass {
public int getMinSum(int []A, int []B)
{
int answer = 0;
int len = A.length;
A = ascendingOrder(A);
B = descendingOrder(B);
for(int i = 0; i < len; i++) {
answer += (A[i] * B[i]);
}

return answer;
}

//bubble ascending sort
public int[] ascendingOrder(int[] Arr) {
int lastIndex = Arr.length;
while(lastIndex!=0){
for(int i = 0; i < lastIndex - 1; i++) {
int temp = Arr[i];
if(Arr[i] > Arr[i+1]) {
Arr[i] = Arr[i+1];
Arr[i+1] = temp;
}
}
lastIndex--;
}
return Arr;
}

//bubble descending sort
public int[] descendingOrder(int[] Arr){
int lastIndex = Arr.length;
while(lastIndex!=0){
for(int i = 0; i < lastIndex - 1; i++) {
int temp = Arr[i];
if(Arr[i] < Arr[i+1]) {
Arr[i] = Arr[i+1];
Arr[i+1] = temp;
}
}
lastIndex--;
}
return Arr;
}
public static void main(String[] args)
{
myClass test = new myClass();
int []A = {1,2};
int []B = {3,4};
System.out.println(test.getMinSum(A,B));
}
}


A, B 수열을 2X2, #X3, 4X4 형태로 만들어보았고 A의 가장 작은 원소가 B의 가장 큰 원소와 곱해져야 가장 작은 최소값을 얻는 것을 확인했다.

A, B를 Sort해야되는데 버블정렬로 오름차순, 내림차순을 구현해서 문제를 풀었는데 시간 복잡도가 O(n^2)이다. O(n^2) 보다 빠른 정렬 알고리즘을 사용해봐야겠다.

Comments