백준 알고리즘/Lang-node.js

[백준/node.js] 1049번 기타줄

Jongung 2022. 3. 19. 00:46

https://www.acmicpc.net/problem/1049

 

1049번: 기타줄

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주

www.acmicpc.net

 

  • 사용언어 : node.js
  • 알고리즘 : 수학, 그리디 알고리즘
  • Solved.ac Tier : SILVER IV

 

 

 

node.js 코드

1. 문제 정리

N개의 기타 줄이 끊어졌다. 그래서 기타 줄을 새로 사야하는데.. 강토씨는 최대한 싸게 기타줄을 교체 하려고한다. 6줄 패키지도 있고 1줄짜리 단품도 있다더라. 

뭐 그리디로 계산 해봐야지 탐욕적인 시키; 

먼저 입력들을 받아 온 뒤 6줄짜리 패키지중에 최솟값과 1줄짜리 최솟값을 구해줬다. 

그리고 제일 먼저 예외 처리 해준 것이 1줄짜리 6개 사는게 패키지보다 싼 경우를 예외 처리 해주었다.

그리고는 그 뒤는 그리디로 처리해주었다.

 

2. 완성 코드

const fs = require('fs');
let [num, ...inputs] = fs.readFileSync("/dev/stdin").toString().trim().split('\n');
let [stringCnt, brand] = num.split(' ').map((e)=>parseInt(e)) , answer = 0;

let brandArr = [], six_string_min = Number.MAX_SAFE_INTEGER, one_string_min= Number.MAX_SAFE_INTEGER;
for(let i = 0; i < brand; i++){
    brandArr[i] = inputs[i].split(' ').map((e)=>parseInt(e))
    if(six_string_min > brandArr[i][0]){
        six_string_min = brandArr[i][0]
    }
    if(one_string_min > brandArr[i][1]){
        one_string_min = brandArr[i][1]
    }
}


if(one_string_min * 6 > six_string_min){
    while(stringCnt>=6){
        answer+= six_string_min
        stringCnt -= 6
    }
    let tempAns = 0;
    while(stringCnt>=1){
        tempAns+= one_string_min
        stringCnt -= 1
    }
    if(tempAns > six_string_min){
        answer += six_string_min
        console.log(answer)
    }
    else{
        answer += tempAns
        console.log(answer)
    }
}
else{
    while(stringCnt>=1){
        answer+= one_string_min
        stringCnt -= 1
    }
    console.log(answer)
}