알고리즘/이코테 실전문제

[정렬] 이코테 (파이썬) 두 배열의 원소 교체 풀이

개발윗미 2021. 8. 25. 19:12

[문제]

동빈이는 두 개의 배열 A와 B를 가지고 있다. 두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는 모두 자연수이다.

 

동빈이는 최대 K번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와 배열 B에 있는

 

원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다. 동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가

 

되도록 하는 것이며, 여러분은 동빈이를 도와야 한다.

 

N, K, 그리고 배열 A와 B의 정보가 주어졌을 때, 최대 K번의 바꿔치기 연산을 수행하여 만들 수 잇는 배열 A의

 

모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하시오.

 

...
... 생략
...

 

[입력 조건]

1. 첫 번째 줄에 N, K가 공백으로 구분되어 입력된다. (1 <= N <= 100,000, 0 <= K <= N)

 

2. 두 번째 줄에 배열 A의 원소들이 공백으로 구분되어 입력된다. 모든 원소는 10,000,000보다 작은 자연수이다.

 

3. 세 번째 줄에 배열 B의 원소들이 공백으로 구분되어 입력된다. 모든 원소는 10,000,000보다 작은 자연수이다.

 

[출력 조건]

최대 K번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력한다.

<입력 예시>
5 3
1 2 5 4 3
5 5 6 6 5
<출력 예시>
26

 

[풀이]

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

a.sort()
b.sort(reverse=True)

for i in range(k) :
  if a[i] < b[i] :
    a[i], b[i] = b[i], a[i]
  else :
    break

print(sum(a))

 

n과 k를 공백으로 구분하여 입력받고 배열 a의 모든 원소와 배열 b의 모든 원소를 각각 공백으로 구분하여 입력받는다.

 

문제를 해결하기 위해서는 배열 a의 원소들을 오름차순으로 정렬하고 배열 b의 원소들을 내림차순으로 정렬한다.

 

반복문을 통해 만약 배열 a의 해당 인덱스 값이 배열 b의 해당 인덱스 값보다 작을 경우 서로 값을 스와프해준다.

 

최종적으로 배열 a 원소들의 합을 출력한다.

 


출처

이것이 코딩 테스트다 with 파이썬 - 나동빈 저