본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 콜라 문제(C#)

by jyppro 2023. 8. 31.

콜라 문제

오늘은 "콜라 문제"를 풀어보도록 하겠습니다. 이제부터는 1단계지만 꽤 난이도가 있는 문제가 나올 예정입니다. 바로 문제 살펴보겠습니다.

 

문제 설명

오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.

정답은 아무에게도 말하지 마세요.

콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?

단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.

문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다. 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 1병을 또 받을 수 있습니다. 이 경우 상빈이는 총 10 + 5 + 2 + 1 + 1 = 19병의 콜라를 받을 수 있습니다.

콜라문제
콜라문제 이미지

문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.

콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • 1 ≤ b < a ≤ n ≤ 1,000,000
  • 정답은 항상 int 범위를 넘지 않게 주어집니다.

 

입출력 예

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

 

입출력 예 설명

입출력 예 #1
본문에서 설명한 예시입니다.


입출력 예 #2
빈 병 20개 중 18개를 마트에 가져가서, 6병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 8(20 – 18 + 6 = 8)개 입니다.
빈 병 8개 중 6개를 마트에 가져가서, 2병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 4(8 – 6 + 2 = 4)개 입니다.
빈 병 4 개중 3개를 마트에 가져가서, 1병의 콜라를 받습니다. 이때 상빈이가 가지고 있는 콜라 병의 수는 2(4 – 3 + 1 = 2)개 입니다.
3번의 교환 동안 상빈이는 9(6 + 2 + 1 = 9)병의 콜라를 받았습니다.

 

시작 코드

using System;

public class Solution {
    public int solution(int a, int b, int n) {
        int answer = 0;
        return answer;
    }
}

 

나의 풀이

using System;

public class Solution {
    public int solution(int a, int b, int n) {
        // a : 내가 줘야하는 양, b : 내가 받는 양, n : 가지고 있는 빈병 개수
        int answer = 0;
        
        while(n >= a)
        {
            answer += (n / a) * b;
            n = (n / a) * b + n % a;
        }
        return answer;
    }
}

 

코드 분석

int형 a, b, n이 주어지며 코드가 시작됩니다. while문으로 n이 a보다 크거나 같으면 안에 들어있는 코드를 계속 진행시킵니다. 안에는 answer에 n을 a로 나눈 값에 b를 곱한 것을 더해주고, n에다가 answer에 넣은 값에 n을 a로 나눈 나머지를 더해 넣어줍니다. 최종적으로 answer값을 리턴합니다.

 

풀이 설명

이번 문제는 문제설명도 상당히 길고 참고용 그림까지 존재합니다. 하지만 생각보다 코드는 짧아서 저도 놀랐습니다.

먼저 a, b, n이 뭔지 알아야 합니다. a는 줘야하는 빈병의 개수, b는 돌려받는 콜라의 개수, n은 가지고 있는 빈병의 개수 입니다. n개의 빈병에서 a만큼 주면 b만큼 돌려받는 방식입니다. 예시 1번으로 위 코드를 돌려보겠습니다.

 

answer에는 (20 / 2) * 1이 처음으로 들어갑니다. answer는 10이 되고, n도 10이 됩니다. n은 여전히 a보다 크기 때문에 다시 while문을 진행합니다. 이번에는 n이 10이기 때문에 answer에는 5가 더해져 15이 됩니다. n은 5가 됩니다. 다시 반복하게 되면 answer는 17, n은 3 한번 더 돌리면 answer는 18가 되고 n은 2가 됩니다. 마지막으로 돌리면 answer는 19, n은 1이 되어 while문에서 빠져나오고 answer를 리턴하게 됩니다.

 

<NEXT>

오늘은 "콜라 문제"를 풀어보았습니다. 앞으로는 지금과 같은 문제가 길고, 일상적인 문제들이 주로 등장할 것입니다. 문제를 꼼꼼히 읽고 원하는 게 무엇인지 파악하는 것도 중요해졌습니다. 다음에는 "명예의 전당(1)" 문제를 다뤄보도록 하겠습니다. 감사합니다.