[프로그래머스/Java] Lv.0 치킨 쿠폰

febCho·2024년 6월 11일
0

코딩테스트

목록 보기
217/253
post-thumbnail

문제

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

- 제한사항

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

풀이

- 오답

문제를 읽고 세웠던 풀이법은 아래와 같다.

  1. 10으로 나눈다.
  2. 나머지는 더한다.
  3. 계속 나누어 기존 쿠폰이 10장 이상이 아닐 때, 남은 쿠폰으로 추가 주문이 가능한지 한 번 더 체크한다.

근데 조금 더 간결하면서도 남은 쿠폰을 올바르게 처리할 수 있는 방법이 있었는데 위에 떠올렸던 풀이법대로 기존 쿠폰과 나머지 쿠폰을 불필요하게 나누어 생각하는 바람에 코드도 비효율적이고 답도 틀렸다. (테케는 통과했는데 제출했더니 16.7점인가 맞음)

반복된 코드이니 하나만 설명하자면, 쿠폰이(치킨 개수와 동일) 10장 이상이라면 계속 while로 루프를 돌며 10장당 하나씩 발생하는 서비스 치킨을 answer에 더해준다. 그리고 그 과정에서 발생하는 남은 쿠폰은 별도로 계산하기 위해 rest라는 변수에 더해주었다. (문제가 발생한 지점)

그리고 chicken이라는 변수 자체를 쿠폰과 동일하게 생각해 주었기 때문에 chicken /= 10; 해주기 전에 10으로 나누어 딱 떨어져 나머지는 발생하지 않지만 서비스 치킨을 주문할 때마다 발생하는 쿠폰을 더해주기 위해 chicken += (chicken / 10 / 10);을 했다.

그렇게 만들어진 chicken = 서비스 치킨 주문으로 얻은 쿠폰들 + rest = 기존 쿠폰에서 남은 쿠폰들로 추가 주문이 가능한지 한 번 더 체크했다. 한 마디로 비효율 ^_ㅜ 결국 쿠폰이 다 쿠폰이지 왜 나눴니..~

class Solution {
    public int solution(int chicken) {
        int answer = 0;
        int rest = 0;
        
        while(chicken >= 10){
            answer += (chicken / 10);
            rest += (chicken % 10);
            chicken += (chicken / 10 / 10);
            chicken /= 10;
        }
        
        int add = chicken + rest;
        while(add >= 10){
            answer += (add / 10);
            rest += (add % 10);
            add /= 10;
        }
        
        return answer;
    }
}

- 정답

오답이 일부 케이스를 통과하지 못하는 것을 확인한 뒤 가장 먼저 생각한 건 하나의 while 안에서 다 해결하자였다. 그리고 주어진 chicken을 쿠폰과 동일한 개념으로 바로 사용했던 것과 달리, 명확한 구분과 이해를 위해 coupons라는 변수를 따로 쓰기로 했다.

또한, while문 안에서 사용할 변수로 serviceChicken을 선언했다. 그냥 answer += coupons / 10;이라고 해도 되지만 또 오답이라면 어느 부분에서 문제가 생긴 건지 찾기 쉽게 하기 위해 의미 전달이 명확한 변수를 사용해 한 단계 더 거쳤다.

암튼 그렇게 쿠폰이 10장 이상이라면 서비스 치킨을 한 마리 이상 주문할 수 있다는 이야기가 되므로 while문을 돌며 10으로 나눈 몫을 answer에 더해주었다.

다음으로는 오답의 원인이었던 남은 쿠폰 처리 과정을 한 줄의 코드로 해결했다. 앞서 오답 풀이에 언급했던 것처럼 결국 다 같은 쿠폰이니, coupons라는 변수에 10으로 나눈 나머지 = coupons % 10serviceChicken을 더했다. 서비스 치킨을 주문할 때도 한 마리당 하나의 쿠폰이 발행되어 주문 개수가 곧 쿠폰 개수이기 때문이다.

한 번에 해결할 수 있는지 생각하는 법을 길러야 함과 의미 전달이 명확한 변수를 사용하는 것의 중요성을 깨달았따.

class Solution {
    public int solution(int chicken) {
        int answer = 0;
        int coupons = chicken;

        while (coupons >= 10) {
            int serviceChicken = coupons / 10;
            answer += serviceChicken;
            
            coupons = (coupons % 10) + serviceChicken;
        }

        return answer;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글