package programmers;
class 치킨_쿠폰_Java_230726 {
/*
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다.
쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다.
시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때
받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
입출력 예 #1
100마리를 주문하면 쿠폰이 100장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다.
10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
따라서 10 + 1 = 11 을 return합니다.
입출력 예 #2
1081마리를 주문하면 쿠폰이 1081장 발급되므로 서비스 치킨 108마리를 주문할 수 있습니다. 그리고 쿠폰이 1장 남습니다.
108마리를 주문하면 쿠폰이 108장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다. 그리고 쿠폰이 8장 남습니다.
10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
1마리를 주문하면 쿠폰이 1장 발급됩니다.
가지고 있는 쿠폰이 총 10장이므로 서비스 치킨 1마리를 추가로 주문할 수 있습니다.
따라서 108 + 10 + 1 + 1 = 120 을 return합니다.
*/
// 쿠폰으로 치킨을 얻기 위한 함수
// 입력값으로 쿠폰의 개수를 받고, 치킨을 얻기 위해 필요한 최소 쿠폰 개수를 반환한다.
// 한 마리의 치킨을 얻기 위해서는 10개의 쿠폰이 필요하며, 쿠폰은 교환 후에도 남은 쿠폰과 함께 누적적으로 사용 가능하다.
// 즉, 10개를 교환하고 남은 쿠폰과 합쳐서 다시 10개를 채우는 방식으로 치킨을 교환할 수 있다.
// Parameters:
// 쿠폰 (int): 보유한 쿠폰의 개수
// Returns:
// int: 치킨을 얻기 위해 필요한 최소 쿠폰 개수
public int solution(int chicken) {
int answer = 0; // 치킨을 얻기 위해 필요한 최소 쿠폰 개수를 저장하는 변수
int 쿠폰 = chicken; // 치킨 교환이 이루어지고 남은 쿠폰의 개수를 저장하는 변수
// 보유한 쿠폰의 개수가 10개 이상일 때까지 반복한다.
while (쿠폰 >= 10) {
int 남은쿠폰 = 쿠폰 % 10; // 10으로 나눈 나머지를 계산하여 남은 쿠폰을 구한다.
answer += 쿠폰 / 10; // 10으로 나눈 몫을 answer에 누적하여 쿠폰을 교환할 횟수를 계산한다.
쿠폰 = 남은쿠폰 + 쿠폰 / 10; // 남은 쿠폰과 쿠폰 교환으로 얻은 새로운 쿠폰을 합하여 다시 쿠폰의 개수를 업데이트한다.
}
return answer; // 치킨을 얻기 위해 필요한 최소 쿠폰 개수를 반환한다.
}
public int solution2(int chicken) {
int answer = 0;
while (chicken >= 10){
int 서비스치킨 = chicken / 10;
int 나머지 = chicken % 10;
chicken = 서비스치킨 + 나머지;
answer += 서비스치킨;
}
return answer;
}
}
package programmers
class 치킨_쿠폰_Kotlin_230726 {
fun solution(chicken: Int): Int {
var answer = 0 // 치킨을 얻기 위해 필요한 최소 쿠폰 개수를 저장하는 변수
var 쿠폰 = chicken // 치킨 교환이 이루어지고 남은 쿠폰의 개수를 저장하는 변수
// 보유한 쿠폰의 개수가 10개 이상일 때까지 반복한다.
while (쿠폰 >= 10) {
val 남은쿠폰 = 쿠폰 % 10 // 10으로 나눈 나머지를 계산하여 남은 쿠폰을 구한다.
answer += 쿠폰 / 10 // 10으로 나눈 몫을 answer에 누적하여 쿠폰을 교환할 횟수를 계산한다.
쿠폰 = 남은쿠폰 + 쿠폰 / 10 // 남은 쿠폰과 쿠폰 교환으로 얻은 새로운 쿠폰을 합하여 다시 쿠폰의 개수를 업데이트한다.
}
return answer // 치킨을 얻기 위해 필요한 최소 쿠폰 개수를 반환한다.
}
fun solution2(chicken: Int): Int {
var answer = 0
var 쿠폰 = chicken
while (쿠폰 >= 10) {
val 서비스치킨 = 쿠폰 / 10
val 나머지 = 쿠폰 % 10
쿠폰 = 서비스치킨 + 나머지
answer += 서비스치킨
}
return answer
}
fun solution_재귀(chicken: Int): Int {
//재귀 종료 조건까지 도달할 때까지 과정을 반복하며 최소 쿠폰 개수를 구합니다.
// = if(chicken < 10) 0 else chicken/10 + solution(chicken/10 + chicken%10) 와 같습니다.
return if (chicken < 10) {
// 기저 조건 (chicken < 10): chicken이 10 미만이면 쿠폰이 부족하여 더 이상 교환할 수 없으므로 0을 반환합니다.
0
} else {
// 재귀 부분: chicken이 10 이상이면, 한 마리의 치킨을 얻기 위해 10개의 쿠폰이 필요합니다.
// chicken / 10을 통해 현재 가지고 있는 쿠폰 중 10으로 교환 가능한 개수를 계산하고,
// chicken % 10을 통해 남은 쿠폰의 개수를 구합니다.
// 그리고 chicken / 10 + chicken % 10을 통해 다음 호출에서 사용할 chicken의 새로운 값으로 대체합니다.
// 이후 재귀적으로 solution 함수를 호출하여 쿠폰을 누적하여 교환하는 과정을 반복합니다.
chicken / 10 + solution_재귀(chicken / 10 + chicken % 10)
}
}
}
댓글
댓글 쓰기