20151020


*이문제는 + 연산자와 - 연사자를 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.





퓨즈/fuse



프로그램 명: fuse(open)

제한시간: 1 초

대부분의 사람들은 연구실에 있는 모든 컴퓨터를 가동하면 얼마 만큼의 전기가 소비되는지 를 인식하지 못한다.

퓨즈가 견딜수 있는 한도를 초과하면 퓨즈가 쉽게 녹을수 도 있다.

전기가 얼마나 필요한 지를 계산하는 것은 쉬운 작업이지만 계속 반복하는 것은 아주 따분한 일이다. 이를 계산하는 일을 도와 주는 것이 일이다.

다음은 각 기기가 소비하는 전기량이다.

  • 본체 한대가 소비하는 전류 1.5 amperes
  • 모니터 한대가 소비하는 전류 1.0 amperes
  • 프린터 한대가 소비하는 전류 2.0 amperes
  • 라우터 한대가 소비하는 전류 0.5 amperes

컴퓨터 한대에 하나의 모니터가 있다.

퓨즈는 각 모든 소비 전기의 최소 두 배를 견딜수 있는 것으로 준비해야 한다. 그리고 퓨즈의 용량은 10 , 20 , 30 , ... 10 의 배수 단위로 사용된다.

입력

입력은 세 개의 음이 아닌 정수가 주어진다. 차례대로 컴퓨터 , 프린터 , 라우터의 수이다. 반드시 컴퓨터의 수보다 다른 기기의 수가 적을 필요는 없다.(실험실이니)

모든 수는 100 이하이다.

출력

최소 퓨즈의 용량을 출력 예의 형식으로 출력한다.

입출력 예

입력

10 2 1

출력

60 amperes

입력

5 4 0

출력

50 amperes

입출력 보충

첫 번째 입출력 예에서

  • 컴퓨터의 수가 10 이니 본체의 수와 모니터의 수는 각 10 대 ...(1.5 + 1.0)* 10 = 25
  • 프린터 2 대 ... 2.0 * 2 = 4.0
  • 라우터 1 대 ... 0.5

총 전류의 합 25 + 4.0 + 0.5 = 29.5

퓨즈는 2 배이상이고 10 의 배수단위의 용량을 사용해야 하므로 29.5 * 2 = 59 ---> 60

출처: cs.utah.edu



제 풀이



1) 풀이

import java.io.PrintStream;
import java.util.Scanner;

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	double computer, printer, router;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		computer = sc.nextDouble();   //컴퓨터(본체+모니터)
		printer = sc.nextDouble(); //프린터
		router = sc.nextDouble();    //라우터
	}
	void result(){
		double temp = 2*(2.5*computer + 2.0*printer + 0.5*router);
		temp = Math.ceil(temp*0.1);
		p.println((int)temp*10+ " amperes");
	}
}





*짧게 코딩하는것도 좋지만 저는 함수와 객체 지향개념을 쓰고 싶어서 이렇게 코딩 했습니다.

우선 3개의 음이 아닌 정수 값을 입력 받기 위해서 computer(본체 + 모니터 한쌍), printer, router(라우터) 변수 3개를 선언을 하고 그 변수에 입력값을 받습니다.

그 다음 result()함수에서 각각의 전류 사용량을 곱해주고 취소 두 배를 견딜 수 있는 것이여야 하기 때문에 2를 곱해 줍니다.

퓨즈의 용량은 10, 20 , 30  10 의 배수 단위 이기 때문에 값이 1의 자리값을 올림을 해줘야 원하는 amperes 소비 전기 값을 알 수 있습니다. 나머지 연산으로 조건문을 써서 하려다가 Math 클래스에 있는 ceil() 함수를 사용 했습니다. ceil 함수는 올림 함수고 소수점 이하를 올림 해주기 때문에 0.1 을 곱해서 1의 자리였던 숫자를 올림 했습니다. 파라미터로는 double 를 써야 하기 때문에 변수를 double 로 선언 했습니다.




추가적으로 조건문이나 ceil 올림 함수를 사용하지 않고도 올림, 반올림, 내림을 구현 할 수 있습니다.

아래 방법이 더 쉬운 코드 같습니다.

fuse hint

일의 자리에서 반올림 , 올림 , 버림

1. 일의자리에서 버림

버림: 123 일때 120 , 128 에서도 120 , ....

123 을 10 으로 나눈 몫은 12 이고 나머지는 3

  • 123 / 10 --> 12
  • 123 % 10 --> 3
123 - 123%10 을 하면 120 이 나옵니다.

다른 방법으로

  1. 123 을 10 으로 나눈 몫이 12 .. 123 / 10
  2. 여기에 10 을 곱하면 120 .. 123 / 10 * 10

참고로 이 성질을 이용하면 123 % 10 은 123 - 123/10*10 과 같은 표현입니다.

2. 일의 자리에서 반올림

반올림:123 에서 120 , 125 에서는 130 , 128 에서 130

수의 일의 자리에 5 를 더하면 5 이상의 수는 십의 자리로 올라가고 5 보다 작은 수는 올라가지 않습니다.

  • (123 + 5)/10 * 10 --> 120
  • (125 + 5)/10 * 10 --> 130
  • (128 + 5)/10 * 10 --> 130

3. 일의 자리에서 올림

올림: 120 에서 120 , 121 에서 130 , 125 에서 130

1 이상 부터 올라가야 하니 9 를 더하면 1 이상의 수는 십의 자리로 올림이 이루어집니다.

  • (120 + 9)/10*10 --> 120
  • (121 + 9)/10*10 --> 130
  • (128 + 9)/10*10 --> 130






+ Recent posts