방안1. A,B 배열 모두 배치가 가능하다면?

package test;

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

public class Main {


	public static void main(String[] args)throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int repeat = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		
		Integer[] array_A = new Integer[repeat];
		int[] array_B = new int[repeat];
		for(int i=0; i<repeat; i++) {
			array_A[i] = Integer.parseInt(st.nextToken());
		}
		st = new StringTokenizer(br.readLine()," ");
		for(int i=0; i<repeat; i++) {
			array_B[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(array_A,Collections.reverseOrder());
		Arrays.sort(array_B);
		int sum=0;
		for(int i=0; i<repeat; i++) {
			sum = sum+(array_A[i]*array_B[i]);
		}
		System.out.println(sum);
	}
}

A를 내림차순 정렬하고 B는 오름차순 정렬하여 곱하여 더해줬다.

 

문제에서 B는 배열을 바꾸지 말라고 했으니 방안2로 가자.

 

방안2

package test;

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

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int repeat = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int[] array_A = new int[repeat];
		int[] array_B = new int[repeat];
		for (int i = 0; i < repeat; i++) {
			array_A[i] = Integer.parseInt(st.nextToken());
		}
		st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < repeat; i++) {
			array_B[i] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(array_A);

		int sum = 0, point = 0, visit=0;;
		int max = -999999;

		boolean[] visited_B = new boolean[repeat];
		boolean check = true;

		while (check) {
			for (int i = 0; i < repeat; i++) {
				if (visited_B[i] == false) {
					if(max<array_B[i]) {
						max = array_B[i];
						visit=i;
					}
				}
			}visited_B[visit]=true;

			sum = sum + (array_A[point] * max);
			point++;
			
			check=false;
			max = -999999;
			for (int i = 0; i < repeat; i++) {
				if (visited_B[i] == false)
					check = true;
			}

		}
		System.out.println(sum);

	}
}

A만 정렬해주고 B에서 최대값을 찾아줬다

가장 작은값 * 최대값을 곱하니 결과적으로 가장 작은합을 구할 수 있다.

B에서 최대값을 또 넘겨주면 안되니, 방문여부로 체크해줬다.

 

'알고리즘(BOJ) > Silver' 카테고리의 다른 글

백준 - 행렬 1080  (0) 2023.02.03
백준 - 팔 1105  (0) 2023.01.31
백준 - 회전하는 큐 1021  (0) 2023.01.27
백준 - 피보나치 함수1003  (0) 2023.01.26
백준 - 1260(DFS&BFS)  (0) 2023.01.21
복사했습니다!