전자레인지

문제

언어

  • JavaScript

순서도

  1. 제시된 3 개의 버튼으로 T 초를 맞출 수 없는지 검사
  2. 주어진 T 초를 몇 분으로 구성되어있는지, 몇 초로 구성되어 있는지 계산
  3. 계산한 분으로 A 버튼의 횟수를 먼저 계산
  4. 계산한 분으로 B 버튼의 횟수를 계산
  5. 계산한 초로 C 버튼의 횟수를 계산

문제 풀이 step 1

  • 버튼 A, B, C 에 지정된 시간은 각각 5 분, 1 분, 10 초입니다.
  • 주어진 시간 T 에 대해서 A, B, C 를 누른 횟수의 합이 최소가 되도록 해야 합니다.
  • 최소가 되도록 하기 위해서는 가장 많은 시간을 차지하는 버튼을 최대한으로 누르고, 그 다음으로 많은 시간을 차지하는 버튼을 최대한으로 누르는 방식 즉, 그리디 알고리즘 형식으로 풀어야 합니다.
  • 따라서 주어진 시간에 대해서 최대한 A 버튼을 누를 수 있는 횟수를 구하고, A 버튼을 누르고 난 후 나머지 시간에 대해서 최대한 B 버튼을 누를 수 있는 횟수를 구하고, B 버튼을 누르고 난 후 나머지 시간에 대해서 C 버튼을 누를 수 있는 횟수를 구하면 됩니다.
  • 그리고 제시된 3 개의 버튼으로 T 초를 맞출 수 없으면 -1 을 출력하라고 되어 있는데, 이는 가작 작은 시간의 버튼인 C 버튼으로 나머지 연산을 해서 0 이 나오지 않으면 -1 을 출력하면 됩니다.
  • 각 버튼에 대해서 횟수를 구하고 출력하면 정답이 됩니다.
  • 추가 설명은 주석에 작성하겠습니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	const T = Number(input[0]);

	// 제시된 3개의 버튼으로 T초를 맞출 수 없는 경우
	if (T % 10 !== 0) return -1;

	// 주어진 요리시간 T 가 몇 분 몇 초 로 구성되어 있는지 계산
	let m = parseInt(T / 60);
	let s = T % 60;

	// 시간이 큰 버튼부터 차례대로 횟수 계산
	const a = parseInt(m / 5);
	const b = m % 5;
	const c = s / 10;

	return `${a} ${b} ${c}`;
};

console.log(solution(input));