Patrick's Devlog

[프로그래머스/C++] 야근 지수 본문

Study/Algorithms Practice

[프로그래머스/C++] 야근 지수

Patrick_ 2023. 11. 15. 15:57

1. 개요

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

 

프로그래머스

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

programmers.co.kr

1-1. 설명

회사원 Demi는 야근을 진행할 때 피로도가 야근 시작지점의 남은 일 작업량의 제곱으로 피로도가 쌓인다. N시간동안 야근 피로도를 최소화할 수 있도록 일한다. Demi가 1시간동안 작업량 1만큼 처리가능할 때, 퇴근까지 남은 N 시간과 각 일에 대한 작업량 works에 대해 야근 피로도를 최소화한 값을 리턴하는 함수를 작성한다. 

1-2. 제한 사항

 - works는 길이가 1이상, 20,000 이하 배열

 - works의 원소는 50,000 이하 자연수

 - n은 1,000,000 이하 자연수


2.구현

2-1. 풀이

남은 N 시간만큼 큰 숫자를 빼주고 남은 작업량에 제곱을 해주면 된다고 단순하게 생각하여 반복문을 통해 풀었더니, 효율성에서 시간초과가 떴다. 시간 복잡도가 O(N)이라서 그런 것 같다. 힙을 사용하면 O(logN)까지 줄일 수 있으므로, 최대힙을 통해 구현하는 것으로 변경하고 실행했더니 시간초과가 뜨지 않았다.

2-2. 코드

#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

long long solution(int n, vector<int> works) {
    long long answer = 0;
    priority_queue<int> queue(works.begin(), works.end());
    for (int num = n; num > 0 ; num--) {
        if (!queue.empty()) {
            int maxNumber = queue.top();
            queue.pop();
            queue.push(maxNumber - 1);
            }
    }
    
    while (!queue.empty()) {
        int currentNumber =  queue.top();
        if (currentNumber <= 0) break;
        queue.pop();
        answer += (currentNumber * currentNumber);
    }
    return answer;
}

 

'Study > Algorithms Practice' 카테고리의 다른 글

[프로그래머스/C++] 입국심사  (1) 2023.12.19
[프로그래머스/C++] 피로도  (0) 2023.11.16
[BOJ/C++] 주식(11501번)  (0) 2023.01.13
[BOJ/C++] 촌수계산(2644번)  (0) 2023.01.12
[BOJ/C++] 피보나치 함수(1003번)  (0) 2023.01.10