[알고리즘][구름]해외 주식 투자

Jaino Song·2024년 6월 13일

알고리즘

목록 보기
5/7

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는 정수이다.

출력

구름이가 주식을 판매하는 순서대로, 해당 회사의 번호를 공백을 두고 출력하시오.

예시 1

입력
3
1.81 3
1.36 4
2 4

출력
3 1 2

예시 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(' '));
	
})();
profile
하루하루 목표를 향해 나아가야지

0개의 댓글