순간을 기록으로

[프로그래머스] 최솟값 만들기/Java 본문

Problem Solving

[프로그래머스] 최솟값 만들기/Java

luminous13 2022. 2. 14. 12:25

문제

https://programmers.co.kr/learn/courses/30/lessons/12941/solution_groups?language=java 

 

프로그래머스

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

programmers.co.kr

 

풀이

두 배열의 원소를 각각 골라 두 원소의곱을 구하고 배열의 길이만큼 계속 더한 값의 최솟값을 구하는 문제다.

잠시 생각해보면 최솟값은 한 배열의 큰 값을 다른 배열의 작은 값으로 곱하는 경우일 때 만들어지는 것을 알 수있다.

따라서 두 배열을 오름차순으로 정렬하고, 반복문과 인덱스를 이용해서 접근하는데 A배열은 첫 원소부터, B 배열은 끝 원소부터 접근하면 된다.

 

주의할 점

배열의 마지막 원소의 인덱스는 배열의 길이 -1인 것을 주의하자.

 

코드

package 프로그래머스.레벨2.최솟값만들기.첫풀이;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Arrays;

/*
* 두 배열의 곱의 합이 최소가 되려면 한 배열의 최솟값이 다른 배열의 최댓값과 곱하는 방식이어야 한다.
* */
public class Solution {

    public int solution(int []A, int []B) {
        int answer = 0;
        int size = A.length;
        Arrays.sort(A);
        Arrays.sort(B);

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

        return answer;
    }

    @Test
    void test() {
        int[] A = {1, 4, 2};
        int[] B = {5, 4 ,4};
        Assertions.assertEquals(29, solution(A, B));

        A = new int[]{1, 2};
        B = new int[]{3, 4};
        Assertions.assertEquals(10, solution(A, B));
    }
}
Comments