문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/12927
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
- 큰 값을 모두 처리하는 것보다 큰 값들을 모두 균등하게 처리해야 제곱값들의 합이 최소가 나옴
- a^2 + b^2 <(a+b)^2 이기 때문(?)
- works에서의 최댓값을 항상 균등하게 맞춰가면서 -1 해야하므로 최댓값을 계속해서 뽑아줘야함
- 이를 정렬로 구현할 시 works는 최대 길이가 n*20,000*log(20,000) 이 발생. (works<=20,000 , n<=1,000,000)
- 대체안으로 항상 큰 값을 pop 해주는 최대 힙 우선순위 큐를 사용 (삽입,삭제 log(n))
소스 코드
import heapq
def solution(n, works):
if(sum(works)<=n):
return 0
answer = 0
q = []
for i in range(len(works)):
heapq.heappush(q,(-works[i])) #최대 힙을 사용할거라 음수값으로 넣어줌
while(n!=0):
max_n = heapq.heappop(q)*(-1)
max_n-=1
n-=1
heapq.heappush(q,(-max_n))
for i in range(len(q)):
answer+=q[i]**2
return answer
print(solution(4,[4,3,3]))
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[해시] 베스트 앨범 (0) | 2023.04.06 |
---|---|
[연습 문제] 숫자 게임 (0) | 2023.04.05 |
[그리디] 단속 카메라 (0) | 2023.04.03 |
[동적 계획법] 등굣길 (0) | 2023.03.31 |
[DFS/BFS] 단어 변환 (0) | 2023.03.30 |