1026 보물

DONGJIN IM·2022년 6월 28일
0

코딩 테스트

목록 보기
109/137

문제 이해

정수 배열 A와 B가 있을 때, S = A[0] X B[0] + ... + A[N-1] X B[N-1]이다.

S의 값을 가장 작게 만들기 위해 A 배열만 재배열할 것이다.

이렇게 구한 최소값 S를 구하는 문제이다.


문제 풀이

사실 A만 변경시키라고 했지만, A와 B를 동시에 배열시켜도 문제 없다.

A를 오른쪽으로 2칸 이동시킨 것은 곧 A를 오른쪽으로 1칸 이동시키고, B를 왼쪽으로 1칸 이동시킨 것과 같은 결과를 낸다.

S 값을 최소로 만들기 위해서는 A를 오름차순으로 재배열하고, B를 내림차순으로 재배열하여 일치하는 Index끼리 곱해줘서 더해주면 된다.

이럴 경우 A의 최솟값은 B의 최댓값과 곱해지고, B의 최솟값은 A의 최댓값고 곱해지며 S를 최소화 시킬 수 있을 것이다
(A와 B의 원소가 음이 아닌 정수여서 가능한 방법)


코드

JAVA

import java.io.*;
import java.util.*;

public class Main {
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) {
		FastReader sc = new FastReader();
		
		int n = sc.nextInt();
		Integer[] A = new Integer[n];
		Integer[] B = new Integer[n];
		
		for(int i =0;i<n;i++) {
			A[i] = sc.nextInt();
		}
		for(int i =0;i<n;i++) {
			B[i] = sc.nextInt();
		}
		
		Arrays.sort(A);
		Arrays.sort(B, Collections.reverseOrder());
        // A를 오름차순 정렬 & B를 내림차순 정렬
		
		int answer = 0;
		for(int i =0;i<n;i++) {
			answer += A[i]*B[i];
		}
		System.out.println(answer);
	}

	static class FastReader // 빠른 입력을 위한 클래스
}

Python

a = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

print(sum([x*y for x,y in zip(sorted(A), sorted(B, reverse=True))]))

결과

profile
개념부터 확실히!

0개의 댓글

관련 채용 정보