상세 컨텐츠

본문 제목

[JS] 콜라 문제 - 프로그래머스

프로그래밍 및 언어/코딩 테스트 문제

by 남민우_ 2024. 11. 20. 12:29

본문

문제

 

예시

a b n result
2 1 20 19
3 1 20 9

 

 

풀이

function solution(a, b, n) {
    let answer = 0;
    let rest = n;
    while(rest >= a)
    {
        let give = parseInt(rest/a)*b;
        rest = give + rest % a;
        answer += give;
    }

    return answer;
}

 

정답을 출력하는 answer 와 계산 중 콜라의 나머지값을 저장하기 위한 rest 를 선언해주었다.

 

예시 1번의 경우를 생각해보면 수식 자체는 간단하게 나타낼 수 있다.

20개가 주어지고, 2개당 1개로 교환할 수 있다. 과정을 하나씩 진행해보면

20개가 10개로, 10개가 5개로, 5개가 2개로, 2개가 1개로 교환된다.

단순 교환만 생각하면 10 + 5 + 2 + 1 이 되지만, 우리는 '교환하고 남은 콜라' 를 생각해야 한다.

교환비대로, 매개변수 표시대로면 a개로 나누어 떨어질 때는 고려하지 않아도 되지만 예시에서 5개가 2개로 교환될 때 1개의 콜라가 남는다. 5 = 2*2 + 1 에서의 1이 남는 것이다.

이 1개는 그대로 들고 있다가 마지막 콜라가 1개 남았을 때와 더하여 2개가 되고, 이를 다시 1개로 교환할 수 있다.

따라서 교환 과정은 20 - 10 - 5- 2/1 - 1/1 - 1 이 되고, 결과는 10 + 5 + 2 + 1 + 1 = 19가 된다.

 

이 과정을 생각하면서 일반화를 진행해보자.

처음에 n개가 주어지고, 이를 a개로 나누면 b개가 된다.

예시에서는 b가 모두 1 이라 놓칠 수 있지만 b가 2가 될 수도 있다.

예를 들어 a가 3이고 b가 2이면 3:2의 교환비가 되는데 이를 같이 고려해야 한다.

따라서 교환 후 받은 콜라의 갯수 give 는 ( n / a) 에 b를 곱한 값이 된다.

let give = parseInt(rest/a)*b;

 

여기서 parseInt 는 계산 결과값을 int 형식으로 바꿔주는 메서드로, 자바스크립트의 경우 가변 변수를 모두 let 으로 선언하기 때문에 float 형식이 취해질 가능성을 고려해 활용하였다.

        

다시 코드로 돌아와서,  rest 변수는 위에서 말한 것처럼 콜라의 나머지값을 저장하기 위해 선언하였다.

이 나머지 값이란 단순히 교환하고 남은 갯수, 5개를 2개로 교환하고 남은 1개를 저장하기 위한 것이 아니라 교환하고 받은 갯수까지 같이 포함하는 변수이다.

따라서 5개를 교환할 때의 rest 값은 2 + 1인 3이 할당되도록 해야 한다.

해서 위에서 이미 2를 계산하여 give 변수에 할당했기 때문에 이 give 변수에 rest 를 a로 나눈 나머지값을 더하여 저장한다.

rest = give + rest % a;

 

이후에는 answer 에 교환하고 받은 콜라의 갯수인 give 값을 더해주기만 하면 된다.

 

이 과정을 반복하는 건데, 모든 반복문이 그렇듯 '언제까지 반복할 것인지' 에 대한 조건 설정이 매우 중요하다.

여기서는 rest >= a, 즉 남은 콜라가 교환할 수 있는 갯수보다 많거나 같을 때 반복하도록 했다.

예를 들어 rest 가 5 이고 a가 2인 경우 반복이 시행되고, 교환이 계속 진행되어 rest 가 1이 되면 a보다 값이 작아져 반복 시행이 중단된다.

'더이상 교환할 수 없을 때까지 교환한다' 라고 이해할 수 있을 것이다.

 

이러한 교환비 계산 과정은

console.log(`rest : ${rest} answer : ${answer}`);

이 코드를 넣어 출력하면서 진행 양상을 볼 수 있다.

 

예시 1의 경우

예시 2의 경우

관련글 더보기