Algorithms/프로그래머스

[프로그래머스] '치킨 쿠폰' - Java

LEFT 2023. 5. 13. 16:47

<문제 제시>

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

<예시 입출력>


<문제 해결 과정>

피자 문제와 유사한 문제이다. 서비스라는 개념이 있어서 특정 조건마다 증가값이 달라져야한다.

Try 1) 

final int SERVICE = 10;
final int GET_COUPON = 1;
int chicken = 1081;
int service_chicken = 0;
int coupon = 0;
int answer = 0;


coupon = chicken / GET_COUPON; // 쿠폰 1081장
System.out.println("치킨을 " + chicken + "마리 시켜먹으면, 쿠폰이 " + coupon
        + "장 지급됩니다.");

service_chicken = coupon / SERVICE; // 쿠폰 1081장이면 108마리 추가
coupon = coupon % SERVICE; // 남은 쿠폰 수
answer = service_chicken;
System.out.println("서비스로 제공되는 치킨은 " + service_chicken + "마리 입니다.");
System.out.println("쿠폰 사용 후 남은 쿠폰 수는 " + coupon + "장 입니다.\n");

// 서비스 치킨에서도 쿠폰발급을 받습니다.
coupon += service_chicken / SERVICE; // 108 / 10 = 10
System.out.println("기존 쿠폰 + 서비스 치킨 쿠폰  = " + coupon);

service_chicken = coupon / SERVICE; // 쿠폰 10장으로 1마리 추가
coupon = coupon % SERVICE; // 남은 쿠폰 수
System.out.println("\n서비스로 제공되는 치킨은 " + service_chicken + "마리 입니다.");
System.out.println("쿠폰 사용 후 남은 쿠폰 수는 " + coupon + "장 입니다.\n");

하다보니 효율적이지 않고 반복문을 사용하지 않고 출력하려다보니 print문이 불필요하게 많아지는 것을 느꼈다.

Solution 1)

int answer = 0;
final int SERVICE = 10;

// 치킨이 서비스(10)보다 큰 동안 반복
while(chicken >= SERVICE) {
    int before_c = chicken / SERVICE;
    int coupon = chicken % SERVICE;

    System.out.println("치킨 " + chicken + "마리에서 얻을 수 있는 서비스 치킨 = " + before_c);
    System.out.println("남은 쿠폰이자 치킨 = " + coupon);

    chicken = before_c + coupon;
    System.out.println("최종 치킨 = " + chicken);

    answer += before_c;
    System.out.println("받을 수 있는 서비스 치킨의 수 = " + answer);
    System.out.println("다음 반복으로 넘어갑니다. \n");
}

return answer;

반복문을 간소화시키고, print문으로 중간 과정을 확인할 수 있었다.

치킨이 10마리 이상이면 서비스가 발생하므로 SERVICE값을 변하지 않는 값인 10으로 설정하고

while(chicken >= SERVICE) 로 반복문 처리해주었다.

coupon은 치킨에서 서비스를 나눈 "나머지"가 쿠폰의 수가 되고,

before_c 는 치킨의 마리 수를 10마리로 나눠가며 업데이트해간다.


<전체코드>

public class chicken_coupon {

	public static int solution(int chicken) {
        int answer = 0;
        final int SERVICE = 10;
        
        // 치킨이 서비스(10)보다 큰 동안 반복
        while(chicken >= SERVICE) {
        	int before_c = chicken / SERVICE;
        	int coupon = chicken % SERVICE;
        	
        	chicken = before_c + coupon;
        	
        	answer += before_c;
        }
        
        return answer;
    }
	
	public static void main(String[] args) {
		int chicken = 1081;
		
		System.out.println(solution(chicken));
	}

}

아직 숙달되지 않은 문제유형이어서 좀 더 효율적으로 풀 수 있는 방법을 찾아봐야겠다고 생각했다.


문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120884

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr