[백준-그리디] 보물 (Java)

Alex Moon·2023년 8월 18일
0

알고리즘

목록 보기
17/27

제한 조건

  • 시간 제한 : 2초
  • 풀이 시간 : 30분

문제

옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 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의 최솟값을 출력한다.

예시

입력출력
5
1 1 1 6 0
2 7 8 3 1
18
3
1 1 3
10 30 20
80
9
5 15 100 31 39 0 0 3 26
11 12 13 2 3 4 5 9 1
528

풀이

배열 A, B의 길이는 N으로 동일하며, 0 < N <= 50이다.
배열의 원소는 0 <= 원소 <= 100이다.

이 문제에는 배열 A를 재배열하여 S의 최솟값을 구하라고 나와 있다. 하지만 실제 출력값에 필요한 것은 S의 최솟값이다.

S의 최솟값을 구하려면 배열 A, B의 각 원소들을 곱하여 더했을 때 최솟값이 나오면 된다.

  • A -> 오름차순 정렬
  • B -> 내림차순 정렬

위와 같이 정렬하여 각 원소를 곱하여 더한 값을 출력하면 간단하게 풀린다.

이 문제에 필요한 자료구조는 ArrayList다.

이 문제의 시간 복잡도는 각 배열의 정렬에 O(NloN), 각 원소를 곱하고 더하는데 O(N)이 된다. 즉, O(NlogN)의 시간 복잡도를 가지게 된다. 각 배열의 최대 크기는 100이므로 이 문제를 풀이할 수 있다.

코드

profile
느리더라도 하나씩 천천히. 하지만 꾸준히

0개의 댓글