나는매일가운데

백준 Greedy 알고리즘 브론즈 전자레인지 본문

코테준비/백준

백준 Greedy 알고리즘 브론즈 전자레인지

전로찡 2023. 7. 31. 15:13
반응형

1, 문제

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초를 맞추기 위한 최소버튼 조작 방법을 구하는 프로그램을 작성해야 한다.

 

2. 문제 분석

 1) 3개의 시간별로 나눠진 버튼이 존재하고, 주어진 시간에 딱 맞게 버튼을 최소한으로 눌러야한다.

 2) 만약 주어진 시간을 정확히 맞출 수 없는 경우는 -1을 출력하

 3) 문자열로 출력해야된다.

 

3) 답

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Electrowave {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// 문제 : T초를 정확히 맞출 수 있는 버튼 클릭최소 횟수
		// 1. T초를 정확히 맞춰야 한다 => 못맞추면 -1
		// 2. 버튼을 누르는 횟수는 최소로 맞춤 => Greedy 알고리즘 (시간초가 긴것부터 나눠서 횟수 구하기)
		
		
		int A = 300; // 5분
		int B = 60; // 1분
		int C = 10; // 10초
		int i = 0;	// 몫
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		int[] buttons = {300, 60, 10};
		String numbers = "";
		
		for(int k=0; k<buttons.length; k++) {
			i=T/buttons[k];
			T %= buttons[k];
			numbers += i+" ";
		}
		
		if(!(T== 0)) {
			 numbers = "-1";
		 }
		System.out.println("answer : "+numbers);
	}
		
		
}

 

4) 느낀점

 - 단순 계산 문제 및 알고리즘 적용 문제이다. Map, Set 등 Collection을 사용하지 않더라도 쉽게 풀 수 있는 문제

 - Greedy 알고리즘 문제이다보니 정렬이 핵심인듯 하다... 최소값을 구하는 문제이므로 주어진 값에 최대값을 나눠가며 문제를 풀 수 있었다.

반응형

'코테준비 > 백준' 카테고리의 다른 글

Greedy 알고리즘 브론즈 거스름돈  (0) 2023.07.31