본문 바로가기
coding/algorithm

[SW Expert Academy] D2 1859. 백만 장자 프로젝트(c++)

by 눈부신음표 2022. 5. 18.
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

댓글