- 문제 URL
- 문제 요구사항
- 접근 방법
- 풀이 순서
- 소스코드
- 문제 풀이 결과
문제 URL
문제 요구사항
- 첫째 줄에 보유한 주식 종목 N이 입력 된다.
- 둘째 줄부터 N줄에 걸쳐 각 줄에 i번 종목의 주식 보유량 T와 주식의 현재 단가 C가 공백을 두고 주어진다.
- 주어진 N개의 주식 정보를 이용하여 다음과 같이 정리한다.
- T와 C를 곱한다.
- 결과 값 소수 2번째 자리부터는 버린다.
- 결과 값이 클수록 우선으로 팔도록 한다.
- 만약, 결과 값이 같다면, 종목 번호 i가 낮을수록 우선적으로 판매 한다.
- 팔아야하는 주식 종목을 번호 별로 공백을 두고 나열하시오.
접근 방법
- 문제에서 주어진 T와 C를 갖고 결과 값을 만드는 게 까다로울 수 있는 문제다. floor 함수를 이용해서 요구하는 결과 값을 만든 후, sort 함수를 이용하여 정렬한 뒤 종목 번호를 출력한다.
풀이 순서
- 주식 종목의 개수 N을 입력 받는다.
- N개의 주식 보유량 T, 주식 현재 단가 C를 입력 받는다.
- T와 C를 곱한 뒤, 그 값에 10.f을 곱하고, floor 함수를 통해 소수점을 모두 버린 뒤, 다시 10.f로 나눠준다.
- 값을 pair<int, double> 벡터에 넣어준다.
- sort 수행
- 결과 값이 같다면, 종목 번호가 작은 것 bool을 반환
- 결과 값이 큰 것 bool을 반환
- 벡터의 first 값들을 공백을 두고 출력하며, 마지막 인덱스에선 공백 출력 안 하게 함
소스코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool comp(pair<int, double> a, pair<int, double> b) {
if (a.second == b.second)
return a.first < b.first;
return a.second > b.second;
}
int main() {
int jusik_cnt;
cin >> jusik_cnt;
vector<pair<int, double>> score;
for (int i = 0; i < jusik_cnt; i++) {
double price;
int cnt;
cin >> price >> cnt;
double tmp = price * cnt;
tmp = floor(tmp * 10.f) / 10.f;
score.push_back({ i + 1, tmp });
}
sort(score.begin(), score.end(), comp);
for (int i = 0; i < score.size(); i++) {
cout << score[i].first;
if (i == score.size() - 1)
break;
cout << " ";
}
return 0;
}
문제 풀이 결과
