링크


문제 요약:  주어진 조건을 이용하여 모든 카드의 숫자 합이 최솟값으로 만들기

문제 해결 방안: 매번 가장 작은 2개의 수를 골라서 연산하기 

문제 해결 키워드: heap 사용 해보기 


2개의 수를 골라서 더한값을 덮어 써야 하므로 

최솟값을 만들려면  항상 배열의 가장 작은 2개의 값을 골라 더하고 더한값을 바꿔야 한다.

이때 매번 sort 를 사용하면 오래 걸릴 수 있으므로 

heap을 사용하여 정렬없이 알아서 작은 값 2개를 뽑는 과정이 필요하다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import heapq
 
# 입력 받기 
n,m=map(int,input().split())
st=list(map(int,input().split()))
 
def solution(m,st):
    # 한번 정렬해주기 
    st.sort()
    forin range(m):
        # 2개 가장 작은수 2개를 빼고 더하기
        x_y=heapq.heappop(st)+heapq.heappop(st)
        # 고른 2개의 수를 바꿔줘야함
        heapq.heappush(st,x_y)
        heapq.heappush(st,x_y)
    
    # 다했으면 최솟값 가져오기
    return sum(st)
 
# 정답 출력하기
print(solution(m,st))
cs






p.s  제출하기 전에 


heapq.heappop(st) 하면 알아서 최솟값을 뽑는걸로 알고있는데

돌려봐도 계속 작은놈이 안나와서  반복문 전에 딱 한번만 sort 로 정렬해서 풀었음

여기 게이들은 나보단 30만배는 잘하니까 sort 명령어 없이 잘 풀 수 있을거라 생각함