728x90
시간제한이랑 타입때문에 좀 헤맸다..
set을 사용했는데, max_element를 사용해도 되지 않을까 하는 생각도 했다.
하지만 전에 계속 도는 프로그램을 만들었었는데 시간초과가 났고, max_element도 O(n)이라는 말을 보고 사용하지 않았다. 다른사람 코드 보면 사용해도 될거같기도하고?
더보기
#include <iostream>
#include <set>
#include <map>
#include <vector>
using namespace std;
int main() {
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int day, price;
cin >> day;
vector<int> days;
map<int, int> price_cnt;
for (int j = 0; j < day; j++) {
cin >> price;
price_cnt[price] += 1;
days.push_back(price);
}
set<int> prices(days.begin(), days.end());
long long result = 0;
for (auto d : days) {
price_cnt[d] -= 1;
result += (*prices.rbegin() - d);
if (price_cnt[d] == 0) prices.erase(d);
}
cout << "#" << i + 1 << " " << result << '\n';
}
return 0;
}
문제
https://swexpertacademy.com/main/code/problem/problemDetail.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
728x90
[접근 1]
우선 전부 돌면서 가격들을 vector인 days에 넣었고, 각 가격 숫자들을 count 했다(price_cnt).
vector<int> days;
map<int, int> price_cnt;
for (int j = 0; j < day; j++) {
cin >> price;
price_cnt[price] += 1;
days.push_back(price);
}
[접근 2]
가격들을 넣은 days를 복사해서 prices라는 set을 만들었고,
하루하루 돌면서 해당하는 가격의 개수는 1개 줄여주고, result에는 set의 맨 뒤 원소 즉, 제일 큰 원소에 당일 가격을 빼서 더해준다.
만약 해당 가격의 price_cnt가 0이된다면 set에서 해당 가격을 제외시켜 이후 최대값을 구하는데 차질이 없게 한다.
set<int> prices(days.begin(), days.end());
long long result = 0;
for (auto d : days) {
price_cnt[d] -= 1;
result += (*prices.rbegin() - d);
if (price_cnt[d] == 0) prices.erase(d);
}728x90
'coding > algorithm' 카테고리의 다른 글
| [programmers] Lv.2 멀쩡한 사각형(c++) - 2nd (0) | 2022.05.18 |
|---|---|
| [programmers] Lv.2 멀쩡한 사각형(c++) - 1st (0) | 2022.05.18 |
| [SW Expert Academy] D1 2072. 홀수만 더하기(c++) (0) | 2022.05.18 |
| [SW Expert Academy] D3 1206. View(c++) (0) | 2022.05.18 |
| [programmers] Lv.1 실패율(c++) (0) | 2022.05.07 |
댓글