Game Develop

[Algorithm] Programmers :: 야근 지수 본문

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 == 0continue;
 
        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씩 빼주고 다시 큐에 넣어주는 작업을 했다.

이 과정을 통해 각각의 각들이 평균값을 향하여 평탄화작업이 되기 때문에 최소의 값을 구할 수 있다.