BOJ/Node.js

[BOJ / Node.js] 1487. 물건 팔기

도리닥닥 2023. 3. 8. 21:17
728x90
 

1487번: 물건 팔기

첫째 줄에 최대 이익을 만들어주는 가격을 출력한다. 이익이 최대인 가격이 여러개라면, 가장 낮은 가격을 출력한다. 또, 어떤 가격으로 팔아도 이익을 남길 수 없다면 0을 출력한다.

www.acmicpc.net

문제

세준이는 오랜 연구기간 끝에 신상품을 내놓았다. 세준이는 오랜 시간이 걸린 만큼 이 상품을 최대 이익에 팔려고 한다.

세준이는 이 상품을 사려고 하는 사람들이 총 몇 명이나 되는지 알아봤다. 무려 N명이나 살 의향을 보였다. 각각의 사람은 자기가 지불할 생각이 있는 최대 한도가 있다. 따라서, 어떤 사람이 20원까지 지불할 생각이 있는데, 세준이가 가격을 30원으로 책정하면 이 사람은 절대 안 살 것이고, 15원으로 책정하면 이 사람은 이 상품을 15원에 살 것이다. (단, 세준이가 안 팔수도 있다.)

그리고, 세준이는 각각의 사람에게 배달하는 비용이 얼마나 걸리는 지 알고 있다.

N명의 사람과, 각각의 사람이 지불할 용의가 있는 최대 금액과 배송비가 주어졌을 때, 세준이의 이익을 최대로 하는 가격을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 세준이의 물건을 구매할 의향이 있는 사람의 수 N이 주어진다. 이 값은 50보다 작거나 같다. 둘째 줄부터 각 사람이 지불할 최대 금액과 배송비가 공백을 사이에 두고 주어진다. 두 값은 모두 106보다 작거나 같은 음이 아닌 정수이고, 배송비는 0이 될 수도 있다.

출력

첫째 줄에 최대 이익을 만들어주는 가격을 출력한다. 이익이 최대인 가격이 여러개라면, 가장 낮은 가격을 출력한다. 또, 어떤 가격으로 팔아도 이익을 남길 수 없다면 0을 출력한다.

예제 입력

3
13 0
22 0
35 0

예제 출력

22

 

Solve

  • 상품의 가격을 결정하기 위해서 사고자하는 사람들의 최대 금액을 기준으로 반복문을 실행합니다.
  • 해당 금액이 최대 금액보다 작거나 같다, 혹은 이 판매가 흑자를 낼 수 있다를 기준으로 이윤값을 더해주면서 최대값을 찾아갔습니다.
  • 이익이 최대인 가격이 여러개라면, 가장 낮은 가격을 출력해야 하기 때문에 반복문 과정에서 낮은 가격을 보장하기 위해 가격을 기준으로 오름차순으로 배열을 한 번 정렬하였습니다.

Code

const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");

const n = +input.shift();
const arr = input.map(el=>el.split(' ').map(el=>+el));

arr.sort((a,b)=>a[0]-b[0]);

let max = 0;
let answer = 0;

for(let i = 0 ; i < n; i++) {
    const [price] = arr[i];
    let sum = 0;
    for(let j = 0; j < n; j++) {
        const [payment, deliveryFee] = arr[j];
        if(price <= payment && price - deliveryFee >= 0) {
            sum += (price - deliveryFee);
        }
    }

    if(max < sum) {
        max = sum;
        answer = price;
    }
}

console.log(answer);