| 난이도: ●○○ | 풀이 시간: 20분 | 시간 제한: 2초 | 메모리 제한: 128MB | 기출: 국제 알고리즘 대회 |
문제: 동빈이는 두 개의 배열 A와 B를 가지고 있다. 두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는 모두 자연수이다. 동빈이는 최대 K번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와 배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다. 동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이며, 여러분은 동빈이를 도와야 한다.
N, K, 그리고 배열 A와 B의 정보가 주어졌을 때, 최대 K번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하시오.
| 입력 조건: – 첫 번째 줄에 N, K가 공백으로 구분되어 입력된다. (1 ≦ N ≦ 100,000, 0 ≦ K ≦ N) – 두 번째 줄에 배열 A의 원소들이 공백으로 구분되어 입력된다. 모든 원소는 10,000,000보다 작은 자연수이다. – 세 번째 줄에 배열 B의 원소들이 공백으로 구분되어 입력된다. 모든 원소는 10,000,000보다 작은 자연수이다. 출력 조건: – 최대 K번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력한다. |
| 입력 예시) 5 3 1 2 5 4 3 5 5 6 6 5 |
| 출력 예시) 26 |
문제 풀이)
이 문제는 보자마자 앞 설명에서 본 swap을 사용하면 되겠구나 바로 떠올렸다.
그런데, A의 합이 최대가 되어야 하므로, A에서 가장 작은 것과 B에서 가장 큰 것을 계속해서 바꿔야한다 (A의 모든 수가 B의 모든 수보다 무조건 커야하게) 그걸 K번 반복한다.
그러면 일단, A는 오름차순, B는 내림차순으로 정렬해두고 앞에서부터 순서대로 바꾸기만 하면 된다.
n, k = map(int, input().split())a = list(map(int, input().split()))b = list(map(int, input().split()))# A는 오름차순, B는 내림차순으로 정렬a.sort()b.sort(reverse=True)# K번 바꿔치기for i in range(k): if a[i] < b[i]: # A의 작은 값보다 B의 큰 값이 더 크다면, a[i], b[i] = b[i], a[i] # A와 B의 원소를 교체(swap) else: # A의 작은 값이 B의 큰 값보다 크거나 같다면, 멈춤 breakprint(sum(a)) # A의 모든 원소의 합을 출력
이걸 실제로 입력 예시를 입력해보면, 아래와 같다.

책의 답도 똑같았다.
n, k = map(int, input().split()) # N과 K를 입력받기a = list(map(int, input().split())) # 배열 A의 모든 원소를 입력받기b = list(map(int, input().split())) # 배열 B의 모든 원소를 입력받기a.sort() # 배열 A는 오름차순 정렬 수행b.sort(reverse=True) # 배열 B는 내림차순 정렬 수행# 첫 번째 인덱스부터 확인하며, 두 배열의 원소를 최대 K번 비교for i in range(k): # A의 원소가 B의 원소보다 작은 경우 if a[i] < b[i]: a[i], b[i] = b[i], a[i] else: # A의 원소가 B의 원소보다 크거나 같을 때, 반복문을 탈출 breakprint(sum(a)) # 배열 A의 모든 원소의 합을 출력
Leave a comment