컴공생 누르지 마세요! 컴공생 울어요.

[정렬] 정렬 (6) 실전문제 - 두 배열의 원소 교체 본문

STUDY/알고리즘

[정렬] 정렬 (6) 실전문제 - 두 배열의 원소 교체

당도최고치악산멜론 2023. 3. 15. 11:34

이코테 p.182 실전문제 - 두 배열의 원소 교체

입력 예시

5 3
5 5 6 6 5
1 2 5 4 3

출력 예시

27

내 소스코드

  • a는 오름차순 정렬, b는 내림차순 정렬 수행
  • a의 i번째 원소가 b의 i번째 원소보다 작을 경우에만 교환
# 입력 받기
n, k = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))

# a는 오름차순, b는 내림차순 정렬렬
a = sorted(a)
b = sorted(b, reverse = True)

for i in range(k):
  if a[i] < b[i]: # a가 b보다 작을 때만 교환 수행
    a[i], b[i] = b[i], a[i]
    
print(sum(a))

교재 소스코드

  • 매번 배열 A에서 가장 작은 원소를 골라서, 배열 B에서 가장 큰 원소와 교체
  • 단, 배열 A에서 가장 작은 원소가 배열 B에서 가장 큰 원소보다 작을 때에만 교체 수행
  • 위 과정을 K번 반복
  • 두 배열의 원소가 최대 100,000개까지 입력될 수 있으므로 O(NlogN)을 보장하는 정렬 알고리즘 이용
# 입력 받기
n, k = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))

# a는 오름차순, b는 내림차순 정렬
a = sorted(a)
b = sorted(b, reverse = True)

# 첫 번째 인덱스부터 확인하며, 두 배열의 원소를 최대 K번 비교
for i in range(k):
  if a[i] < b[i]: # a의 원소가 b의 원소보다 작은 경우
    a[i], b[i] = b[i], a[i] # 두 원소 교체
  else: # a의 원소가 b의 원소보다 크거나 같을 때, 반복문 탈출
    break
    
print(sum(a)) # a의 모든 원소의 합 출력

 

Comments