https://school.programmers.co.kr/learn/courses/30/lessons/12927
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
#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;
}
'<algorithm> > 프로그래머스' 카테고리의 다른 글
프로그래머스 압축 c++ (4) | 2023.08.07 |
---|---|
프로그래머스 이중우선순위큐 c++ (0) | 2023.08.06 |
프로그래머스 네트워크 c++ (2) | 2023.07.03 |
프로그래머스 타겟넘버 c++ (2) | 2023.07.02 |
프로그래머스 뉴스 클러스터링 c++ (0) | 2023.07.02 |