Algorithm/Programmers
[Algorithm] Programmers :: 야근 지수
MaxLevel
2023. 4. 21. 01:40
https://school.programmers.co.kr/learn/courses/30/lessons/12927
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
struct Node
{
int num;
};
struct cmp
{
bool operator() (const Node& a, const Node& b)
{
return a.num < b.num;
}
};
long long solution(int n, vector<int> works)
{
long long answer = 0;
long long sum = 0;
for (int i = 0; i < works.size(); ++i)
{
sum += works[i];
}
if (sum <= n) return 0;
priority_queue<Node, vector<Node>, cmp> pq;
for (int i = 0; i < works.size(); ++i)
{
pq.push({ works[i] });
}
while (n > 0)
{
--n;
int temp = pq.top().num;
pq.pop();
if (temp-1 == 0) continue;
pq.push({ temp-1 });
}
while (!pq.empty())
{
answer += pq.top().num * pq.top().num;
pq.pop();
}
int asdf = 0;
return answer;
}
|
cs |
역대 푼 3레벨 짜리 중 가장 최단시간에 풀지 않았나...라고 생각하는 문제다.
이 문제는 각 원소의 제곱을 더했을 때 어떤 경우에 가장 값이 낮은가?를 생각해야 하는데,
일단 허용되는한, 반드시 제일 큰값에서 하나씩 빼야 한다.
제곱이기 때문에 다른 곳에서 아무리 커버치려고 해도 제일 큰 수의 제곱만큼 값을 커버칠 수 없다.
그렇기 때문에 우선순위큐를 활용해서 잔여시간이 제일 많은 값을 top으로 오게 하여, n번만큼 값을 1씩 빼주고 다시 큐에 넣어주는 작업을 했다.
이 과정을 통해 각각의 각들이 평균값을 향하여 평탄화작업이 되기 때문에 최소의 값을 구할 수 있다.