티스토리 뷰

📌 10162. 전자레인지

3개의 시간 조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작 시간에 더해진다. 버튼 A, B, C에 지정된 시간은 각각 5분, 1분, 10초이다.

 

냉동음식마다 전자레인지로 요리해야할 시간 T가 초단위로 표시되어 있다. 우리는 A, B, C 3개의 버튼을 적절히 눌러서 그 시간의 합이 정확히 T초가 되도록 해야 한다. 단 버튼 A, B, C를 누른 횟수의 합은 항상 최소가 되어야 한다. 이것을 최소 버튼 조작이라고 한다. 

 

만일 요리시간이 100초라고 하면(T=100) B를 1번, C는 4번 누르면 된다. 이와 다르게 C를 10번 눌러도 100초가 되지만 이 경우 10번은 최소 횟수가 아니기 때문이 답이 될 수 없다. 이 경우 B 1번, C 4번, 총 5번이 최소버튼 조작이다. 그리고 T=234와 같이 3개의 버튼으로 시간을 정확히 맞출 수 없는 경우도 있다. 

 

여러분은 주어진 요리시간 T초를 맞추기 위한 최소버튼 조작 방법을 구하는 프로그램을 작성해야 한다. 

 

 

 

✏️ 입력. 

첫 번째 줄에는 요리시간 T(초)가 정수로 주어져 있으며 그 범위는 1 ≤ T ≤ 10,000이다. 

 

 

📋 출력. 

여러분은 T초를 위한 최소버튼 조작의 A B C 횟수를 첫 줄에 차례대로 출력해야 한다. 각각의 횟수 사이에는 빈칸을 둔다. 해당 버튼을 누르지 않는 경우에는 숫자 0을 출력해야 한다. 만일 제시된 3개의 버튼으로 T초를 맞출 수 없으면 음수 -1을 첫 줄에 출력해야 한다. 

 

 

💡 서브 테스크

 

📢 테스트 케이스 

 

✍️  구구절절 첫번째 방법 / Java

1. 시간 정보를 입력할 배열 option에 초기화

2. 선택 횟수를 입력할 배열 select 생성  

3. input이 10으로 나누어 떨어지는지 확인 

    3-1. 나누어 떨어지는 경우 4번으로 이동

    3-2. 나누어 떨어지지 않는 경우 -1 출력 후, 7번으로 이동

4. input이 300보다 큰 숫자인지 확인 

    4-1. 300으로 나누어 떨어지면 300초 선택 횟수를 input/300으로 변경 후, 6번으로 이동

    4-2. 300보다 크면  300초 선택 횟수를 input/300으로 변경 후, 5번으로 이동

    4-3. 300보다 작으면 5번으로 이동

5. input이 60으로 나누어 떨어지는지 확인

    5-1. 60으로 나누어 떨어지면 60초 선택 횟수를 input/60으로 변경 후, 6번으로 이동

    5-2. 60보다 크면 10초 선택 횟수 +1, temp -10 하고 5번으로 이동 

    5-3. 60보다 작으면 10초 선택 횟수 + (input/10) 하고 6번으로 이동

6. 선택 횟수를 입력한 배열 select의 값을 모두 출력

7. 프로그램 종료

 

import java.util.Scanner;

public class Main {
	
	// select 출력을 위한 메서드
	static void print(int[] arr) {
		for(int i : arr) {
			System.out.print(i+" ");
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);	
		
		int input = sc.nextInt();
		
		int[] option = {300, 60, 10};	// 1. 시간 정보 입력할 배열 option
		int[] select = {0, 0, 0};	// 2. 선택 횟수 입력할 배열 select
		
		// 3. 입력값이 10으로 나누어 떨어지는지 확인
		if(input % option[2] != 0) {
			// 3-2. 나누어 떨어지지 않는 경우 -1 출력 후, 프로그램 종료
			System.out.println(-1); 
			System.exit(0);			
		}
		
		
		// 4-3. input이 300이상이 아닌 경우, temp에 input으로 초기화 되어있어야 하므로 미리 초기화
		int temp = input;	
		
		// 4. input이 300이상인지 확인 
		if(input >= option[0] && input % option[0] == 0) {
			// 4-1. input이 300으로 나누어 떨어지는 경우, option 값 수정 후, 출력하고 프로그램 종료
			select[0] += input / option[0];
			print(select);
			System.exit(0);		
		}else if(input > option[0]) {
			// 4-2. input이 300보다 큰 경우
			select[0] = input / option[0];	// 300으로 나눈 몫으로 선택 횟수 초기화 
			temp = input % option[0];	// 300으로 나눈 후 나머지를 temp 초기화
		}
		
		while(true) {
			// 5. 60초로 나누어 떨어지는지 확인
			if(temp % option[1] == 0) {
				// 5-1. input이 60으로 나누어 떨어지는 경우 option 수정 후, 출력하고 프로그램 종료
				select[1] += temp / option[1];
				print(select);
				System.exit(0);	
			}else if(temp > option[1]){	
				// 5-2. temp가 60초보다 크면 
				select[1]+=1;		// 60초 선택횟수 +1
				temp-=option[1];	// temp-=1
			}else if(temp < 60) {
				// 5-3. temp가 60보다 작으면, option 값 수정 후 break
				select[2] = temp / option[2];
				break;
			}
		}
		
		// 6. select 값 모두 출력
		print(select);
	}
}

 

 

✍️  간단하게 푼 두번째 방법 / Java, Python

위 : 간단 풀이 / 아래 : 구구절절 풀이

설탕 배달(백준 2839) 에 얽매여서 구구절절 첫 번째 방법으로 처음에 생각했다가, 풀고 나니 결국 몫만 계속 챙기면 된다는 사실을 깨달아서 코드를 더 간단히 수정했다. 첫 번째 코드도 틀린 답은 아니고 의외로 차지하는 메모리나 걸리는 시간에는 큰 차이가 없었다

 

* 설탕 배달 문제와의 차이점 : 설탕 배달 문제와 달리 답을 구할 수 없는 경우를 사전에 if문을 통해 걸러내주었다 

 

 

👍 Java

import java.util.Scanner;

public class Main {
	
	// select 출력을 위한 메서드
	static void print(int[] arr) {
		for(int i : arr) {
			System.out.print(i+" ");
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);	
		
		int input = sc.nextInt();
		
		int[] option = {300, 60, 10};	// 1. 시간 정보 입력할 배열 option
		int[] select = {0, 0, 0};	// 2. 선택 횟수 입력할 배열 select
		
		if(input % 10 != 0) {
			System.out.println(-1);
			System.exit(0);
		}
		
		for(int i = 0; i < option.length; i++) {
			select[i] = input / option[i];
			input = input % option[i];			
		}
		
		print(select);
	}
}

 

👍 Python

num = int(input())
option = [300, 60, 10]
select = [0, 0, 0]
temp = num

if num % 10 != 0:
  print(-1)
else :
  for i in range(0,len(option)) :
    select[i] = temp // option[i]
    temp = temp % option[i]
  for cnt in select :
    print(cnt, end=" ")

 

댓글
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
최근에 올라온 글
글 보관함
Total
Today
Yesterday