20151020
*이문제는 + 연산자와 - 연사자를 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.
퓨즈/fuse
프로그램 명: fuse(open)
대부분의 사람들은 연구실에 있는 모든 컴퓨터를 가동하면 얼마 만큼의 전기가 소비되는지 를 인식하지 못한다.
퓨즈가 견딜수 있는 한도를 초과하면 퓨즈가 쉽게 녹을수 도 있다.
전기가 얼마나 필요한 지를 계산하는 것은 쉬운 작업이지만 계속 반복하는 것은 아주 따분한 일이다. 이를 계산하는 일을 도와 주는 것이 일이다.
다음은 각 기기가 소비하는 전기량이다.
- 본체 한대가 소비하는 전류 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 - 123%10 을 하면 120 이 나옵니다.
- 123 / 10 --> 12
- 123 % 10 --> 3
다른 방법으로
- 123 을 10 으로 나눈 몫이 12 .. 123 / 10
- 여기에 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 에서 1301 이상 부터 올라가야 하니 9 를 더하면 1 이상의 수는 십의 자리로 올림이 이루어집니다.
- (120 + 9)/10*10 --> 120
- (121 + 9)/10*10 --> 130
- (128 + 9)/10*10 --> 130
'알고리즘(dovelet 문제풀이) > 1층' 카테고리의 다른 글
r2/r2(r2/r2 알고리즘) (0) | 2015.10.21 |
---|---|
블럭 색칠하기/paintblock(블럭 색칠하기 알고리즘) (0) | 2015.10.20 |
손해 본 금액/business(손해 본 금액 알고리즘) (0) | 2015.10.20 |
인공지능 시계/koi_watch(인공지능 시계 알고리즘) (0) | 2015.10.19 |
세자리수 곱셈/three(세자리수 곱셈 알고리즘) (0) | 2015.10.19 |