일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 프로세스 상태
- Bronze
- level1
- PrefixSum
- Zenject
- dirtyflag pattern
- algorithm
- Project
- programmers
- binary search
- BFS
- Modern C++
- Gold
- 프로그래머스
- SWEA
- Flyweight Pattern
- stack
- knapsack Problem
- trie
- Euclidean
- BOJ
- two pointer
- 8-Puzzle
- level3
- effective C++
- solid 원칙
- Unity
- LEVEL2
- Silver
- 3D RPG
Archives
- Today
- Total
Patrick's Devlog
[프로그래머스/C++] 야근 지수 본문
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;
}
'Algorithm > 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 |