그럴듯한 개발 블로그
반응형

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

프로그래머스

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

programmers.co.kr

works vector이 주어지는데, 총 n을 각원소에서 빼준 다음 그 값들의 제곱을 리턴하는 문제다.
처음엔 map 자료구조를 사용 해서 제일 큰 값에 n번만큼 접근해 빼주면 되겠다 생각했다.

#include <string>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;
// 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다
// 대충 보니까 제곱이 되는 베이스인 works의 최댓값을 제일 작게 만들어야 야근지수가 작아짐

int getSumOfWorks(vector<int> works) {
    int sum = 0;
    for (int i = 0; i < works.size(); i++)
        sum += works[i];
    return sum;
}

long long solution(int n, vector<int> works) {
    long long answer = 0;
    map<int, int>   m;
    if (n >= getSumOfWorks(works)) // 야근을 안해버리는경우
        return 0;
    for (int i = 0; i < works.size(); i++) {
        if (map.find(works[i]) != map.end())
            map[works[i]] += 1;
        else
            map[works[i]] = 1;
    }
    while (n--) {
        auto    it = map.end();
        it--;
        it-> // ...? 어케하지
    }
    return answer;
}

근데 마지막 원소 접근해서 하나 빼고 --key접근해서 하나 더해주는 연산을 어케하는지 모르겠어서 구글링해봤는데 방법이 안 나왔다. 혹시 아는 사람있으면 알려주세요...
+ 이터레이터는 *을 붙히면 포인터처럼 실제 값에 접근 가능하다
큐 스택으로는 매번 최댓값 접근해주는 연산이 불가능하고, 답이 안 나와서 구글링을 해 보니 우선순위 큐로 푸는 문제였다.
우선순위 큐는 큐와 다르게 최댓값이 top이다. 계속 최댓값에 접근하고 싶을 때 사용하면 될 듯 하다.
우선순위 큐에 대해 더 알고싶다면 여기로..
https://blog.encrypted.gg/1015

[실전 알고리즘] 0x17강 - 우선순위 큐

안녕하세요, 이번 시간에는 우선순위 큐를 배워보려고 합니다. 뭔가 시작전에 어떤 말을 해야 할지 깊게 고민을 했는데 딱히 할 말이 생각나는게 없습니다. 그냥 바로 본론으로 들어가겠습니다.

blog.encrypted.gg

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

using namespace std;
// 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다
// 대충 보니까 제곱이 되는 베이스인 works의 최댓값을 제일 작게 만들어야 야근지수가 작아짐

int getSumOfWorks(vector<int> works) {
    int sum = 0;
    for (int i = 0; i < works.size(); i++)
        sum += works[i];
    return sum;
}

long long solution(int n, vector<int> works) {
    long long answer = 0;
    priority_queue<int> pq;
    if (n >= getSumOfWorks(works)) // 야근을 안해버리는경우
        return 0;
    for (int i = 0; i < works.size(); i++)
        pq.push(works[i]);
    while (n--) {
        int value = pq.top() - 1;
        pq.pop();
        pq.push(value);
    }
    while (!pq.empty()) {
        answer += pq.top() * pq.top();
        pq.pop();
    }
    return answer;
}
반응형
profile

그럴듯한 개발 블로그

@donghyk2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!