컴퓨터/프로그래머스

프로그래머스 - 12927번: 야근 지수 [Java]

이상한 나그네 2023. 10. 27. 08:28

문제: https://school.programmers.co.kr/learn/courses/30/lessons/12927

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public long solution(int n, int[] works) {
        long answer = 0;
        PriorityQueue <Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
    	for(int w : works)
            queue.add(w);
        for(int i = 0; i < n; i++)
            queue.offer(queue.poll() - 1);
        
        for(int q : queue)
            if(q > 0)
                answer += q * q;
        return answer;
    }
}

2. 설명

n만큼의 수를 works에 균등하게 나누어야 하는데 이 방식을 힙 정렬을 이용하여 해결할 수 있습니다.

long answer = 0;
PriorityQueue <Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
for(int w : works)
    queue.add(w);

최대 힙을 기준으로 우선순위 큐를 생성합니다. 그리고 반복문을 통해서 works의 값들을 우선순위 큐에 저장합니다.

for(int i = 0; i < n; i++)
    queue.offer(queue.poll() - 1);

for(int q : queue)
    if(q > 0)
        answer += q * q;

n만큼 우선순위 큐에서 최대값 꺼내서 -1을 한 뒤 다시 우선순위에 삽입합니다.

만약 0미만의 수, 즉 -1이하의 수가 제곱이 되면 양수가 되어 answer에 영향을 미치기에 q의 값이 양수일 경우에만 제곱한 값을 answer 더한 뒤 answer를 반환하면 쉽게 해결됩니다.

3. 정리

  1. 힙 정렬을 하여 시간초과를 해결할 수 있다.
  2. 우선순위 큐를 적절히 활용하자.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges