문제
문제 설명
구름이는 소수점 거래 기능을 지원하는 어떤 증권사의 서비스를 이용하여 해외 주식 거래를 시작했다고합니다.
소수점 거래 기능은 구매 수량을 소수점 단위로 할 수 있어 일 만원으로 한 주에 백 만원이 넘는 주식도 구매할 수 있습니다.
구름이는 1번 회사부터 N번 회사까지, 총 N개의 회사에서 발행한 해외 주식을 구매했고, 구름이가 보유한 해외 주식에 대한 정보는 보유한 주식의 개수 V(i)와 주식 1개 기준 가격인 w(i)로 나타냅니다.
구름이는 다음과 같은 순서로 가지고 있는 모든 주식을 순서대로 판매하려 한다고 합니다.
- 주식의 평가 금액이 높은 회사의 주식부터 판매합니다.
- 평가 금액은 보유한 주식의 개수와 해당 주식의 단가를 곱한 값입니다.
- 평가 금액은 소수점 아래 2번째 자리에서 절사합니다.(소수점 첫번째 자리까지만 표현합니다.)
- 만약 평가 금액이 같은 주식이 둘 이상 있다면, 회사의 번호가 작은 회사의 주식부터 먼저 판매합니다.
구름이가 보유한 주식의 정보가 주어질 때, 구름이가 주식을 판매한 순서를 출력하면 되는 문제입니다.
풀이
문제에서 주어진 순서대로 구름이의 주식을 판매하기 위해 먼저 total이라는 배열을 선언해주어 구름이가 보유하고 있는 주식을 소수점 아래 2번째 자리에서 절사하여 순서대로 total에 추가해주는 작업을 하였습니다.
let total = []
let answer = ''
info.map((data,idx) => {
[sale,num] = data.split(" ");
const account = Math.floor(Number(sale) * Number(num) * 10) / 10
total.push({"index": idx+1, "num":account})
})
total에 모든 주식 내용을 추가해준 다음 평가 금액이 높은 순서대로 주식을 판매해야 하기 때문에 total을 정렬해주는 작업을 하였습니다. 정렬 기준은 주식 가격을 기준으로 내림차순 정렬하였으며, 만약 주식 가격이 같을 경우 index을 기준으로 오름차순 정렬해주었습니다.
total.sort((a,b) => {
if(a.num === b.num){
return a.index - b.index
}else{
return b.num - a.num
}
})
이렇게 정렬된 total의 요소들은 주어진 판매 조건에 만족하는 순서로 값이 들어가 있기 때문에 정답을 출력할 변수 answer에 순차적으로 total의 모든 요소들을 추가해준 다음 answer을 출력해주어 문제를 해결하였습니다.
total.map((account) => {
answer += account.index+" "
})
console.log(answer)
아래는 풀이에 사용한 전체 코드입니다.
const readline = require('readline');
(async () => {
let rl = readline.createInterface({ input: process.stdin });
let N = 0;
let info = [];
rl.on('line', function(line) {
if(N === 0) N = Number(line)
else info.push(line)
}).on('close', function() {
solution(N, info)
})
})();
function solution(N, info){
let total = [] //주식 정보를 저장하는 배열
let answer = ''//정답을 출력할 변수
//info의 모든 요소들 순회하며, 각 요소들을 소수점 2번째 자리에서 절사
//절사한 값을 total에 순차적으로 추가해줍니다.
info.map((data,idx) => {
[sale,num] = data.split(" ");
const account = Math.floor(Number(sale) * Number(num) * 10) / 10
total.push({"index": idx+1, "num":account})
})
//판매 금액이 높은 순으로 내림차순으로 정렬해줍니다.
//판매 금액이 같을 경우 먼저 추가 된순으로 정렬해줍니다.
total.sort((a,b) => {
if(a.num === b.num){
return a.index - b.index
}else{
return b.num - a.num
}
})
//정렬 된 total의 모든 요소를 answer에 순차적으로 추가해줍니다.
total.map((account) => {
answer += account.index+" "
})
console.log(answer)
}
'코딩테스트 > 구름' 카테고리의 다른 글
[구름 Level] Lv.02 거울 단어 (JavaScript) (0) | 2024.06.28 |
---|