1 분 소요

1. 문제

https://www.acmicpc.net/problem/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} 같이 재배열하면 된다.


2. 핵심 아이디어

  • A 배열의 최소값과 B 배열의 최대값을 곱해서 결과에 더함
  • pop 함수를 이용해 A 배열의 최소값과 B 배열의 최대값을 배열에서 뺌


3. Python 문제풀이

import sys
input = sys.stdin.readline

n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
result = 0

for i in range(n) :
  result += min(a) * max(b)
  a.pop(a.index(min(a)))
  b.pop(b.index(max(b)))

print(result)


4. Java 문제풀이


댓글남기기