새소식

백준,programmers [JAVA]

[JAVA] 백준 알고리즘 1026번 문제 풀이

  • -

문제

옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.

길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.

S = A[0] × B[0] + ... + A[N-1] × B[N-1]

S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.

S의 최솟값을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거나 같은 음이 아닌 정수이다.

출력

첫째 줄에 S의 최솟값을 출력한다.

 

예제 입력 1

5
1 1 1 6 0
2 7 8 3 1

예제 출력 1

18

예제 입력 2

3
1 1 3
10 30 20

예제 출력 2

80

예제 입력 3

9
5 15 100 31 39 0 0 3 26
11 12 13 2 3 4 5 9 1

예제 출력 3

528

힌트

예제 1의 경우 A를 {1, 1, 0, 1, 6}과 같이 재배열하면 된다.

 

풀이

원리를 먼저 생각해보자. S가 최솟값이 나오려면 A의 최솟값이 B의 최댓값과 곱해져야 한다.

이를 어떻게 구현할 수 있을까?

문제에서는 A의 수를 재배열하고, B의 수는 재배열하면 안 된다고 명시하고 있다.

하지만 문제 풀이를 위해서는 A, B 모두 재배열을 해야 한다. 문제의 의도를 잘 파악하여야 한다.

S의 최솟값을 구하는 과정만 보게 되면, B의 최댓값에 A의 최솟값을 구하는 과정만 구현하면 된다. 이를 위해서 A,B 모두 재배열을 할 수 밖에 없다.

최솟값을 구하려면 A는 오름차순을 하여 최솟값부터 나열하고, B는 내림차순을 하여 최댓값부터 나열하여 순서대로 곱해주면 된다.

이때, 내림차순을 하려면 아래와 같은 형태로 적어주어야 한다.

Integer[] B = new Integer[n];

평소처럼 int[] A = new int[n]; 과 같이 적어주게 되면 오류가 발생할 것이다. 이유는 다음과 같다.

자바에서는 오름차순으로 정렬할 때, Arrays.sort()를 지원한다. 이때, 만약 내림차순으로 정렬을 하고 싶다면

 Arrays.sort(array, Collections.reverseOrder());

이런 형태로 구현해야 한다. Collections.reverseOrder()를 위해서 해당 배열을 Int[] 형태가 아닌 Integer[] 형태로 구현해주어야 한다.

 

아래는 전체 소스 코드다. 개념과 원리만 알면 어렵지 않은 문제였다.

하지만 문제를 이해하는데 오래 걸려서 애를 먹었다... 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.