process.exit() 진짜 이거 떄문에 몇시간 날림...
구름이는 소수점 거래 기능을 지원하는 어떤 증권사의 서비스를 이용하여 해외 주식 거래를 시작했다. 소수점 거래 기능은 구매 수량을 소수점 단위로 할 수 있어서 일 만원으로 한 주에 백 만원이 넘는 주식도 구매할 수 있다.
구름이는 1번 회사부터 번 회사까지, 총 1 개의 회사에서 발행한 해외 주식을 구매했다.
구름이가 보유한 해외 주식에 대한 정보는 보유한 주식의 개수 v; 와 주식 1개 기준 가격인
W; 로 나타낸다.
구름이는 다음과 같은 순서로 가지고 있는 모든 주식을 순서대로 판매하려 한다.
• 주식의 평가 금액이 높은 회사의 주식부터 판매한다. 이때, 평가 금액이란 보유한 주식의 개수와 해당 주식의 단가를 곱한 값이다. 단, 평가 금액은 소숫점 아래 2번째 자리에서 절사한다.
• 만약 평가 금액이 같은 주식이 둘 이상 있다면, 회사의 번호가 작은 회사의 주식부터 먼저 판매한다.
구름이가 보유한 주식의 정보가 주어질 때, 구름이가 주식을 판매할 순서를 출력하시오.
첫 줄에 현재 보유한 해외 주식의 종목 N개가 주어진다.
그 다음 N출에 걸쳐 주식 정보 Vi, Wi가 1번 회사부터 순서대로 공백을 두고 주어진다.
• 1 ≤ N ≤ 1,000,000
• 0 ≤ Vi ≤ 1,000
• Vi는 실수이다.
• 0 ≤ Wi ≤ 10,000
• Wi는 정수이다.
구름이가 주식을 판매하는 순서대로, 해당 회사의 번호를 공백을 두고 출력하시오.
입력
3
1.81 3
1.36 4
2 4
출력
3 1 2
6
2.86 2
3.1 2
1.29 4
0.1 4
4.4 1
4.28 4
출력
6 2 1 3 5 4
// Run by Node.js
// 1번 회사부터 N번 회사까지 총 N개의 회사에서 발행한 주식을 구매함
// vi = 보유한 주식의 개수
// wi = 주식 1개 기준 가격
// 평가 금액이 높은 회사의 주식부터 순서대로 판매한다.
// 평가 금액 = 보유한 주식 개수 * 주식 가격
// 평가 금액은 소숫점 아래 2번째 자리에서 절사 예: 5.43 -> 5.4
// 평가 금액이 같은 주식이 둘 이상이면, 회사의 번호가 작은 주식부터 판매
// 주식을 판매할 순서를 출력
const readline = require('readline');
(async () => {
let rl = readline.createInterface({ input: process.stdin });
// 입력을 저장할 배열 선언
let input = [];
for await (const line of rl) {
// 한 줄씩 입력을 넣어준다. 그리고 trim()으로 양 끝에 불필요한 공백을 지워준다.
input.push(line.trim());
}
// 입력 닫기
rl.close();
// 주식의 갯수를 변수에 저장한다. 입력은 문자열로 들어오기에, 입력을 정수가 바꾸어 준다.
let stockAmount = Number(input[0]);
// 보유 주식의 가격와 수량을 가지는 배열을 선언해준다.
let stockPriceList = [];
// input 배열에 저장된 보유 주식의 가격과 수량을 주식의 양 만큼 가져온다.
for (let i = 1; i <= stockAmount; i++) {
// input 배열에 저장된 보유 주식의 가격과 수량을 destructuring으로 변수에 저장해준다. 이때 input 배열에 문자열로 저장된 데이터를 배열로 변환 후에
// map을 돌려서 정수로 변환한 후에 destructuring 한다.
const [price, quantity] = input[i].split(' ').map(Number);
// 평가 가격을 계산한다. toFixed는 반올림을 하기에, floor를 사용해서 소숫점 한자리까지만 저장한다.
const evaluation = Math.floor((price * quantity) * 10) / 10;
// 인덱스를 효율적으로 사용하기 위해, 인덱스를 키로, 주식의 평가 가격을 값으로 객체의 형태로 stockPriceList 배열에 저장한다.
stockPriceList.push({ index: i, evaluation });
}
// 평가 가격를 기준으로 내림차 순으로 정렬한다. 이때 평가 가격이 같은 주식들은 인덱스가 낮은 순으로 정렬한다.
stockPriceList.sort((a, b) => {
// 만약 평가 가격이 같다면
if (b.evaluation === a.evaluation) {
// 인덱스가 낮은 순으로 정렬한다.
return a.index - b.index;
}
// 평가 가격 순으로 내림차 순으로 정렬한다.
return b.evaluation - a.evaluation;
});
// stockPriceList에 map을 돌려서 인덱스만 들어있는 배열을 생성한다.
const ans = stockPriceList.map(x => x.index);
// 출력 조건에 맞게 배열을 띄어쓰기를 중간에 넣어서 문자열로 변환 후에 출력한다.
console.log(ans.join(' '));
})();