티스토리 뷰
📌 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=" ")
'Computer Science > 백준 알고리즘' 카테고리의 다른 글
[백준.2902 - Java, Python] KMP는 왜 KMP일까? (0) | 2021.10.27 |
---|---|
[백준.2455 - Java, Python] 지능형 기차 (0) | 2021.10.27 |
[백준.2839 - Java, Python] 설탕 배달 (0) | 2021.10.24 |
[백준.1065,1316-Python] 한수 / 그룹 단어 체커 (0) | 2021.10.12 |
[백준.07568-Python] 덩치 (0) | 2021.03.19 |