본문 바로가기

백준/JavaScript

[JS] 백준 일반 수학 1 - 세 번째 이야기

728x90

 

 

문제 2720번

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

 

2720번: 세탁소 사장 동혁

각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.

www.acmicpc.net

 

문제를 읽는데...

 

'어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.' -> ???

 

...

 

일단 해보자...

보니까 그리디 알고리즘을 이용하는 것 같다.

어떤 식으로 할까 하다가 다른 분의 풀이를 보니까 이런 식으로 작성해야겠다는 생각이 들어서 해봤다.

const readFileSyncAdress = process.platform === 'linux' ? '/dev/stdin':'./input.txt'
const input = require("fs").readFileSync(readFileSyncAdress).toString().trim().split('\n').map(x=>Number(x));
const T = input.shift();    //해당 요소 삭제
const coins = [25,10,5,1]; //센트로 단위를 바꿈

input.forEach((change)=>{ //받은 테스트 케이스 개수만큼
    let count = [0,0,0,0];    //거스름돈 개수
    for(let i=0;i<coins.length;i++){
        if(change>=coins[i]){
            count[i] = Math.floor(change/coins[i]); //소수점 이하는 버림
            change = change%coins[i];
        }
    }
    console.log(count.join(' '));
});

 

 

돈을 센트로 계산했기 때문에 coins 배열에 센트로 변경한 동전들을 넣어준다.

forEach함수를 이용해 맨 앞의 테스트 케이스 개수를 뺀 input 배열을 순회해 주었다.

그리고 잔돈의 개수를 넣어줄 count 배열을 따로 만들어서, 입력받은 돈이 coins의 돈보다 크거나 같을 때 둘을 나눠서 개수를 count 배열에 저장해 준다. 그리고 나머지 돈을 %를 이용하여 change에 저장한다. 그렇게 동전을 다 거슬러줄 때까지 반복해 주면 된다.

 

입력받을 때 trim()을 안 써서 자꾸 틀렸다고 나왔다...

분명 잘 나오는데 이상하다 했는데 공백이 들어가거나 했나 보다.

 

[참고] https://s0ojin.tistory.com/18

 

 

728x90