20151022


*이문제는 별로 안 좋은 문제 입니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.





버터 먹기/butter  안 좋은 문제








프로그램 명: butter

제한시간: 1 초


n 마리의 쥐가 크기가 같은 n 개의 버터를 먹는데 n 시간이 걸린다고 할 때 , m 마리의 쥐가 m 개의 버터를 먹는데 걸리는 시간을 구하는것이 문제이다. 각각의 쥐가 버터를 먹는 속도는 모두 동일하다고 한다.

입력

차례대로 n,m 이 주어진다. 각 수는 1000 이하의 자연수 이다.

출력

시간을 출력한다.

입출력 예

입력

3 3

출력

3





제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int mouse, butter;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		mouse = sc.nextInt();   //가격
		butter = sc.nextInt(); 	// 페소 단위
	}
	void result(){
		p.println(mouse);
	}
}





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

문제를 보시면 알겠지만 그냥 입력 값을 그대로 출력하는 문제 입니다.
문제가 안 좋아서 푼 사람들도 다들 허무하다는 의견이 많네요 ㅎㅎ
이 문제는 문제 풀이 설명 생략하겠습니다.




 




20151021


*이문제는 Math.pow() 함수를  알고 있으면 편합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.





사탕/coci_slatkisi







프로그램 명: coci_slatkisi

제한시간: 1 초


미르코는 사탕가게안에 있는 매우 많은 사탕을 샀다. 그는 항상 정확한 양을 지불하지 못해서 가게주인 아주머니와 협상을 했다. 미르코는 아주머니에게 본인이 가진 가장 작은 지폐를 말하고, 그녀는 그가 지불할 수 있는 가장 가까운 값을 "반올림"한다.

예를 들어보자. 만약 미르코가 최소 100쿠나 지폐를 가지고 있고 그가 150쿠나 어치의 사탕 사길 원한다면, 가게 주인은 200쿠나로 반올림할 것이다. 만약 그가 149쿠나 만큼 사길 원하면, 그녀는 100쿠나로 반올림할 것이다.

최근 미르코는 가게 주인이 그를 속이고 있다고 의심한다. 그는 당신에게 그를 도와줄 수 있는 프로그램을 작성하길 원한다.

그녀의 어머니는 1, 10, 100, ... , 1000000000 단위의 지폐만을 준다. 그는 반드시 10의 거듭제곱꼴의 지폐만을 가진다. 미르코는 지폐를 매우 많이 가지고 있다.

입력

첫번째 줄에는 사탕의 가격 C (0 ≤ C ≤ 1 000 000 000)와 미르코가 가진 최소 지폐의 단위 K가 주어진다. (10^K 이 최소 지폐이다.)

출력

미르코가 지불해야하는 반올림한 값을 출력한다.

입출력 보충

입력

184 1

출력

180

10^1 = 10 이 최소로 가진 단위이니 180 190 중 180 이 가까워서 답은 180 

입력

182 2

출력

200

10^2= 100 이 최소로 가진 단위이니 100 과 200 중 200 이 가까워서  200

Mirko buys a lot of candy in the candy shop. He cannot always pay the exact ammount so the shopkeeper and he have an agreement. He tells the shopkeeper the smallest bill he has, and she rounds his ammount to the nearest number he can pay.

For example, if the smallest bill Mirko has is a hundred bill, and he wants to buy 150 Kunas of candy, the shopkeeper rounds his ammount to 200 Kunas. If he wants to buy 149 Kunas of candy, the shopkeeper rounds his ammount to 100 Kunas.

Lately, Mirko suspects the shoopkeeper is trying to cheat him. He asked you to help him. Write a program that will help him.

His mother only gives Mirko 1, 10, 100, 1 000, ... , 1 000 000 000 Kuna bills. He never has bills that are not powers of 10. The bills he does have, he has in large ammounts. Mirko buys a lot of candy in the candy shop. He cannot always pay the exact ammount so the shopkeeper and he have an agreement. He tells the shopkeeper the smallest bill he has, and she rounds his ammount to the nearest number he can pay.

For example, if the smallest bill Mirko has is a hundred bill, and he wants to buy 150 Kunas of candy, the shopkeeper rounds his ammount to 200 Kunas. If he wants to buy 149 Kunas of candy, the shopkeeper rounds his ammount to 100 Kunas.

Lately, Mirko suspects the shoopkeeper is trying to cheat him. He asked you to help him. Write a program that will help him.

His mother only gives Mirko 1, 10, 100, 1 000, ... , 1 000 000 000 Kuna bills. He never has bills that are not powers of 10. The bills he does have, he has in large ammounts.

입력

The first and only line of input contains two integers, C (0 ≤ C ≤ 1 000 000 000), the price of candy Mirko is going to buy, and K (0 ≤ K ≤ 9), number of zeros on the smallest bill Mirko has.

출력

The first and only line of output should contain one integer, C rounded to the nearest amount Mirko can pay.

입출력 예

입력

184 1

출력

180

입력

123450995 1

출력

123451000

입력

182 2

출력

200
출처: COCI 2009/2010 contest3 2/6
번역: Fate






제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int ammount, temp, pay = 1;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		ammount = sc.nextInt();   //가격
		temp = sc.nextInt(); 	// 페소 단위
	}
	void result(){
		pay = (int)Math.pow(10, temp);
		temp = (ammount + pay/2)/pay;
		p.println(temp*pay); 
	}
}





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


입력 받는 값은 사탕의 가격 (ammount) , 10제곱근의 수 (temp) 를 받습니다. 
그리고 제곱근의 수를 받았으면 몇 자리 값의 돈인지를 풀어 줘야 겠죠.
제가 풀때는 pow() 함수를 몰랐었기 때문에 for문을 안쓰고 풀어봐야 겠다고 하다가
포기하고 그냥 for문을 사용했었습니다.


for 문을 사용하면

for(int a= 0; a<temp; a++){
     pay = pay * 10;
}

제약 조건이 없다면 for 문을 사용해도 상관 없겠죠.
무튼 pow() 함수는 double 파라미터를 인자로 받는 제곱근 함수 입니다.
pow(10, 3); => 1000     or        pow(10,1); => 10
그래서 간단하게 pow 함수로 제곱근 값을 만들어주고 반올림 처리를 해주기 위해서 돈 단위 pay 의 절반 값을 사탕 가격에 더해주고 금액 단위로 몫 연산자를 해주고 마지막엔 금액 단위를 다시 곱해주면 됩니다.

이해가 안가시는 부분이 있으면 댓글 남겨주세요.ㅎㅎ



 



20151021


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





논문인용/coci_faktor




프로그램 명: coci_faktor

제한시간: 1 초


[문제요약] 과학 논문 평가의 주요 요소는 다른 논문에 얼마나 많은 인용이 일어나는가가 주요 요소이다.

만약 38 개의 논문에 894 번의 인용이 일어났다면

  • 평가 점수는 894/38 = 23.53
  • 올림하면 24 이다.(항상 올림)

y 개의 논문에 x 번의 인용이 일어난 경우 주요 요소 z 를 구할 수 있다. 문제는 y , z 가 주어질 때 최소 x 를 구하는 것이다.


Impact factor of a scientific journal is a measure reflecting the average number of citations to articles published in science journals. For this task we are using a simplified formula for calculating the impact factor:

Total sum of all citations articles published in the journal recived
--------------------------------------------------------------------
              Total number of articles published

Rounding is always preformed up. For example the impact factor of the “Journal for ore research and time wasting” that published 38 articles quoted 894 times is 894 / 38 = 23.53 rounding up to 24.

You are the editor of one scientific journal. You know how much article you are going to publish and the owners are pushing you to reach a specific impact factor. You are wondering how many scientists you will have to bribe to cite your article to meet the owners demands. Since money is tight you want to bribe the minimal amount of scientists.

입력

First and only line of input will contain 2 integers, A (1 ≤ A ≤ 100), number of articles you plan to publish and I (1 ≤ I ≤ 100) impact factor the owners require.

출력

First and only line of output should contain one integer, the minimal number of scientists you need to bribe.

입출력 예

input

38 24

output

875

input

1 100

output

100

input

10 10

output

91
출처:COCI 2009/2010 contest2 1/6





제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int y, z;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		y = sc.nextInt();   
		z = sc.nextInt(); 	
	}
	void result(){
		p.println((y*z)-(y-1));
	}
}





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


수식으로 표현하면 X(인용)/Y(논문) = Z(주요 요소) 입니다. 그런데 Y(논문) , Z(주요 요소) 를 알려주고 X(인용) 값이 미지수가 됩니다. 수식으로 풀면 x = z*y 가 됩니다. 그런데 주요 요소 값이 항상 올림으로 처리 하는 부분과 최소값을 구하라고 했습니다.


z 는 이미 올림 처리가 된 값이죠 그럼 x/y 값에서 올림 처리가 되면 z 값이 될수 있는 값중에서 최소값은  z 값에서 y 값보다 1 작은 수를 빼줘야 합니다.


예) 1의 자리중에서 올림이 되어지는 최소 값은 1 입니다. 0->올림 0,  1-> 올림 10

x 값이 20 이고 y 값이 10 이면 (20/10) x 값에 -9 를 해줘야 11/10 -> 1.1 이 값이 올림 했을때 2가 될 수 있는 최소 값 입니다.


혹시 이해가 안가시면 뎃글 남겨주세요 ㅎ



20151021


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





r2/r2 (r2알고리즘)




프로그램 명: r2

제한시간: 1 초

r1,r2 의 평균 m 은

r1 , m 은 알고 있는데 r2 를 까먹었다. r2 를 구하여라.

입력

정수 r1,m 이 주어진다. 두 수는 -1000 이상 1000 이하이다.

출력

r2 를 출력한다.

입출력 예

입력

11 15

출력

19

입력

4 3

출력

2
출처:coci 2006





제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int r1, m;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		r1 = sc.nextInt();  
		m = sc.nextInt(); 	
	}
	void result(){
		p.print(2*m - r1);
	}
}





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


r1, r2 의 평균 m 중에서 1r 과 m 을 알려준다고 했으니까 미지수가 1개인 수식을 풀면 되는거죠


m = (r1 + r2)/2 에서 양쪽에 2를 곱하면

2m = r1 + r2 에서 r2 만 남기기 위해 양쪽을 r1 값으로 빼기 연산을 합니다.

2m -r1 = r2


r2 의 값은 2m - r1 입니다. 이번문제는 쉽네요 ㅎ







20151020


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





블럭 색칠하기/paintblock




프로그램 명: paintblock

제한시간: 1 초


크기가 1*1*1 인 정육면체를 가지고 가로 A 세로 B 높이 C 인 직육면체를 만든 후 A×B×C (2≤A,B,C≤120)의 블록 겉면에 페인트를 칠하였다.

아래의 그림은 3x3x3 인 경우의 보기이다.

이 때 2 개의 면만 페인트가 칠해진 블록의 개수를 구하는게 문제이다. (블록은 직육면체이다)

입력

A , B , C 가 차례대로 입력된다. A 는 가로, B 는 세로, C 는 높이이다.

출력

2개의 면만 페인트가 칠해진 블록의 개수를 첫째 줄에 출력한다.

입출력 예

입력 

3 3 3 

출력 

12
출처:tncks0121(박수찬) 





제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int a, b, c;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		a = sc.nextInt();   //가로
		b = sc.nextInt(); 	//세료
		c= sc.nextInt();    //높이
	}
	void result(){
		a = a-2;
		b = b-2;
		c = c-2;
		p.println((a+b+c)*4);
	}
}





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


2개의 면만 페인트가 칠해진 블록을 먼저 이해하셔야 합니다.

그림을 그려보면 쉽게 이해가 되는데요.



빨간색 부분중에서 큐브의 각 꼭지점은 3면에 페인트가 칠해지기 때문에 총 8개의 꼭지점은 제외 됩니다. 그리고 각각의 면을 보면 블록 테두리 가운데 정사각형 부분을 보면 이 면은 1개의 면만 칠해지기 때문에 제외됩니다.

결국 2개의 면에 페인트가 칠해지는건 그림에서 가장자리 부분인 흰색 블록이죠.

그럼 흰색 블록을 구하려면 각각의 x축 y축 z축 에서 양끝에 있는 블록 1개씩 총 2개를 제외하면 블록의 개수를 알 수 있습니다.
그리고 각 축 마다 4개의 흰색 부분 블록이 있습니다. 가로 x축, 세로 y축, 높이 z축이 있으니깐 각각 4배수를 구해줘야 하죠


그럼 이제 코딩을 해보면


우선 3개의 정수 값을 입력 받기 위해서 a, b, c 변수 3개를 선언을 하고 그 변수에 입력값을 받습니다.


그 다음 result()함수에서

각 축의 개수에서 양끝 블록 총 2개를 빼줍니다. 그리고 각 축마다 4개의 같은 형식의 블록이 있기 때문에 4배수를 해주면 됩니다. 


큐브를 이해하는게 중요했던 문제입니다.



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






20151020


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





손해 본 금액/business




프로그램 명: business

제한시간: 1 초


4 개의 정수가 입력으로 주어진다.

40 70 50 20

차례대로

  • 원가 -- 40
  • 정가(판매가) -- 70
  • 손님이 물건값으로 지불한 돈 중 가짜 돈 -- 50
  • 주인이 손님에게 거스름돈으로 지불한 돈 -- 20

문제의 내용은

  • 정가가 70 원 인데 , 주인이 손님에게 거슬러 준 돈이 20 원 이므로 손님이 주인에게 지불한 금액은 90 원으로 유추 할 수 있다.
  • 이 중 50 원이 가짜 돈이므로 진짜 돈은 40 원 이다.
  • 즉 주인이 받는 진짜 금액이 40 원에서 주인이 거슬러 준 돈이 20 원 이므로 실제적으로 주인이 받은 금액은 20 원.
  • 그런데 원가가 40 원이므로 주인은 20 원의 손해를 본 것이다.

입력

4 개의 정수 값 N , M , P , C 가 입력으로 주어진다. 각각은 0 에서 500000 사이다.

  • 원가
  • 정가
  • 위조 지폐 금액
  • 거스름돈

N < M 이고 P <= M + C . 즉 C 를 보면 손님이 지불한 금액을 알수 있고 그 중 P 원이 위조 지폐이다. 물론 지불한 돈 모두가 위조 지폐일 수가 있다.

예를 들어

40 70 100 30

원가가 40 원이고 정가가 70 원인 물건을 거스름돈 30 원을 주었으니 손님이 지불한 금액은 100 원이고 이 돈 모두 위조 금액이다.

출력

주인이 (손해를 본 경우에는 양수 , 손해도 이익도 아니면 0 , 이익을 본 경우는 음수) 금액을 출력한다.

  • 70원을 손해 보았을 경우 -> 출력값 : 70
  • 손해도 이익도 아닐 경우 -> 출력값 : 0
  • 60원을 이익 보았을 경우 -> 출력값 : -60

입출력 예

입력

40 70 100 30
 
출력

70

입력

40 70 50 20

출력

20

입력

14604 32391 3902 153

출력

-13885
출처:POJ Monthly--2005.07.31, Wang Yijie



문제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int orimoney, sellmoney, fmoney, rmoney;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		orimoney = sc.nextInt();   //원가
		sellmoney = sc.nextInt(); //정가
		fmoney = sc.nextInt();    //손님이 물건값으로 지불한 돈 중 가짜 돈
		rmoney = sc.nextInt();    //주인이 손님에게 거스름돈으로 지불한 돈
	}
	void result(){
		p.println(orimoney-(sellmoney-fmoney));
	}
}






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

우선 4개 의 자연수 값을 입력 받기 위해서 orimoney(원가), sellmoney(정가), fmoney(가짜 돈), rmoney(거스름 돈) 변수 4개를 선언을 하고 그 변수에 입력값을 받습니다.

그 다음 result()함수에서

손님이 준 총 금액은 정가 + 거스름 돈 입니다.


 sellmoney + rmoney

손님이 준 총 금액에서 가짜 돈을 뺀 값이 주인이 받은 진짜 돈이죠

(sellmoney + rmoney)-fmoney

주인은 이 돈을 받고 거스름 돈을 줬으니 거스름 돈을 빼줍니다.

((sellmoney + rmoney)-fmoney)-rmoney

손님에게 거스름 돈과 가짜 돈을 뺀 값에서 원가를 빼면 이익과 손해를 알 수 있습니다. 

(((sellmoney + rmoney)-fmoney-)-rmoney)-orimoney

수식만 남은 상황에서 보니 거스름 돈은 더 했다가 빼주기 때문에 0이 되겠죠 그래서 수식에서 지워 줍니다. 

 (sellmoney -fmoney)-orimoney



출력 값을 보시면 손해인 경우 양수로 나와야 하기 때문에 원가에서 남은 돈을 빼줘야 양수가 나오게 됩니다. (그냥 위의 식에서 나온 값에 -1 을 곱해줘도 됩니다.)

*거스름 돈이 조금 혼란 스럽게 했던 문제였습니다.






20151019


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





인공지능 시계/koi_watch




프로그램 명: koi_watch

제한시간: 1 초


KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 초 단위로 자동적으로 계산한다.

또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.

훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 초 단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.

입력

  • 첫 째 줄에는 현재 시각이 나온다.
    • 시 A (0 <= A <= 23)
    • 분 B ( 0 <= B <= 59)
    • 초 C ( 0 <= C <= 59)
  • 두 번째 줄에는 요리하는 데 필요한 시간 D ( 0 <= D <= 500 000)가 초 단위로 주어진다.

출력

첫째 줄에 종료되는 시각의 시, 분, 초을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수이며, 분, 초는 0부터 59까지의 정수이다. 디지털 시계는 23시 59분 59초에서 1초가 지나면 0시 0분 0초가 된다.)

입출력 예

입력 

14 30 0
200

출력 

14 33 20

입력 

17 40 45
6015

출력 

19 21 0

입력 

23 48 59
2515

출력 

0 30 54
출처:2012 지역 본선 중등 1/5




문제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int hour, minute, second, sec;
	
	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		hour = sc.nextInt();
		minute = sc.nextInt();
		second = sc.nextInt();
		sec = sc.nextInt();
	}
	void result(){
		minute = minute + hour*60;
		second = second + minute*60;
		sec = sec + second;
		
		second = sec%60;
		minute = sec/60;
		hour = minute/60;
		
		p.println(hour%24 + " " + minute%60 + " " + second);
	}
}





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

우선 4개 의 자연수 값을 입력 받기 위해서 hour, minute, second, sec 변수 4개를 선언을 하고 그 변수에 입력값을 받습니다.

그 다음 result()함수에서 시간 값을 분으로 바꿔 입력 받았던 분 값과 더 해 줍니다. 그리고 분값을 초 단위로 바꿔 입력 받았던 초 단위 값과 더 해 줍니다. 1번째 줄에서 입력 받은 시간을 초로 바꿔 준 것이 되겠죠? 그럼 2번째 입력받은 초단위 값과 더해주고 두 값을 더한 초단위 값을 다시 시, 분, 초 로 나눠주는 코딩입니다.


// 전 이제 이런 문제를 풀어보는데 이게 중등 문제 였다니 .. 슬퍼지네요ㅠ













20151019


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





세 자리수 곱셈/three


프로그램 명: three
제한시간: 1 초
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
   472…… (1)
 ×385…… (2)
---------------
  2360…… (3)
 3776 …… (4)
1416  …… (5)
--------------
181720…… (6)

(1)과 (2) 위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6) 위치에 들어갈 값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세 자리 자연수가 주어진다.

출력

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

입출력 예

입력

472
385

출력

2360
3776
1416
181720
출처:koi 초등 지역본선 2 번


문제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int temp, temp1, one, two, three;
	
	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		temp = sc.nextInt();
		temp1 = sc.nextInt();
		
	}
	void result(){
		one = temp1%10;
		two = (temp1%100)/10;
		three = temp1/100;
		one = one*temp;
		two = two*temp;
		three = three*temp;
		
		p.println(one);
		p.println(two);
		p.println(three);
		p.println(one + two*10 + three*100);
	}
}





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

우선 2개의 자연수 값을 입력 받기 위해서 temp,temp1 변수 2개를 선언을 하고 그 변수에 입력값을 받습니다.

그 다음 result()함수에서 입력받은 temp1 을 1 의 자리, 10의 자리, 100의 자리 숫자를 가려내기 위해서

몫과 나머지 연산을 사용 합니다. 그럼 다음 각 자리수를 temp 에 각각 곱해주고 자리수를 맞추기 위해

 10의 자리는 10을 곱하고 100의 자리는 100을 곱한 뒤 더해주면 됩니다. 


*자바에서 나머지 연산을 사용하지 않고 temp1 에서 toStirng() , toCharArray() 를 사용해서도 자릿값을 가져올 수도 있습니다.











20151018


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




초 변환/sec


프로그램 명: sec(open)

제한시간: 1 초

초(second)가 입력으로 주어진다.

이 를 몇 날 몇 시간 몇 분 몇 초 인지를 변경하는 프로그램을 작성하시오.

입력

초(second)가 입력으로 주어진다. 10 000 000 이하의 정수 이다.

출력

4 개의 정수를 출력한다.

날 시 분 초

입출력 예

입력

70

출력

0 0 1 10




문제 풀이


풀이1)

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

public class Main {
 
	Scanner sc = new Scanner(System.in);        
	PrintStream p = System.out;
	long temp;
	
	
	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();  
	    ma.result();
	}
	
	void input(){
		temp = sc.nextLong();
		
	}
	void result(){
		long day   = temp/(60*60*24);
		long time   = (temp%(60*60*24))/(60*60);
		long minute = (temp%(60*60))/(60);
		long second = temp%(60);
		System.out.println(day+ " " + time + " " + minute + " " +second);
	}
}

풀이2)

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

public class Main {
 
	Scanner sc = new Scanner(System.in);        
	PrintStream p = System.out;
	int temp, second, minute, time, day;
	
	
	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();  
	    ma.result();
	}
	
	void input(){
		temp = sc.nextInt();
		
	}
	void result(){
		minute = temp/60;
		time = minute/60;
		day = time/24;
		
		System.out.println(day+ " " + time%24 + " " + minute%60 + " " +temp%60);
	}
}



이번 문제는 어려운건 아니지만 생각하는 시간이 좀 걸렸네요. 우선 나름 직관적인 코딩을 하겠다고 초, 분, 시간, 하루 를 구분하겠다고 일부러 저렇게 60(분) 60*60(시간) 60*60*24(하루) 이런식으로 구현했습니다. 초부터 거꾸로 설명을 하자면


초는 60초 1분으로 나머지 연산을 하면 쉽게 구 할 수 있습니다.

분은 60*60 1시간으로 나머지 연산을 한 값에 1분 으로 몫을 구했습니다.

시간은 60*60*24 하루로 나머지 연산을 한 값에 60*60 1시간으로 몫을 구했습니다.

날 은 가장 큰 범위 이기 때문에 바로 60*60*24 하루 단위로 몫을 구해주면 됩니다.  


시간, 분, 초 단위에 나머지 연산을 한 이유는 각 범위 값을 넘어가는 수를 버리기 위해서 였습니다.

분 단위를 구하기 위해서는 날(day) 보다 작은 범위 24시간 아래 값이 남아야 하기 때문에 24시간이 넘는 범위를 버리기 위해서 였습니다. 

예) 하루는 24시간인데 범위 값을 버리지 않고 그냥 temp%(60*60) 을 하면 29시간, 400시간 이런식으로 범위가 넘어가게 된다.







20151018


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




거스름 돈/change



프로그램 명: change
제한시간: 1 초
상점에서 물건을 사고 지폐로 돈을 내면 거스름 돈을 줘야 한다. 이 때 동전을 어떻게 해서 줘야 하는지 계산하시오.

돈은 반드시 1000 원을 내며 , 거스름 돈은 10 원 , 50 원 , 100 원 동전으로 하고 큰 동전 우선으로 준다.

입력

물건 값으로 세자리 자연수가 입력으로 주어진다. 일의 자리는 0 이다.

출력

동전 100 원 , 50 원 , 10 원의 개수를 출력한다.

입출력 예

입력

530

출력

4 1 2





문제 풀이



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

public class Main {
 
	Scanner sc = new Scanner(System.in);        
	PrintStream p = System.out;
	int a;
	
	
	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();  
	    ma.result();
	}
	
	void input(){
		a = sc.nextInt();
	}
	void result(){
		int result = 1000 - a;
		int hund = result/100;
		int fif = (result%100)/50;
		int ten = (result%50)/10;
		p.print(hund + " " + fif + " " + ten);
	}
}


우선 3자리수 자연수 1개를 입력 받아야 하기 때문에 변수 a 를 선언과 값을 직접 입력 받아야 하기 때문에 Scanner 객체를 만들고 정수형 값을 입력 NextInt(); 를 사용해서 변수에  물건 값을 입력 받습니다.(정수 값으로 하기 위해서 int 를 사용 했습니다.)

그런 다음 1000원에서 3자리수 물건 값을 빼면 3자리수 잔돈이 남겠죠 제일 큰 수인 100원의 개수를 구하기 위해서는 100으로 나눈 몫이 100원의 개수가 됩니다.

50원의 개수는 100으로 % 연산자를 하면 100원을 제외한 나머지 잔돈의 금액이 나옵니다. 그런 그값에 /50 연산을 해줘서 50원 개수의 몫을 구합니다.

10원의 개수는 잔돈에서 100으로 % 연산자를 하고 50으로 %연산자를 한 나머지 값이나 50으로 %연산자를 한 나머지 값과 같습니다. 그래서 잔돈에 % 50 연산을 하고 /10 연산을 해서 10원의 몫을 구하면 10원의 개수가 됩니다.  










20151019


*이문제는 Scanner 와 System.out.println() 출력문을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.




몫과 나머지 구하기/q_r



프로그램 명: q_r
제한시간: 1 초
두 자연수를 입력으로 받아 첫 번째 수를 두 번째 수로 나눈 몫과 나머지를 구하는 프로그램을 작성하세요.

입력

두 자연수가 입력으로 주어진다. 두 수는 10000 이하의 자연수이다.

출력

몫 과 나머지를 출력한다.

입출력 예

입력

8 5

출력

1 3




문제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);        
	PrintStream p = System.out;
	int a;
	int b;
	
	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();  
	    ma.result();
	}
	
	void input(){
		a = sc.nextInt();
		b = sc.nextInt();
	}
	void result(){
		int result = a/b;
		int rest = a%b;
		p.print(result + " " + rest);
	}
}





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

우선 2개의 자연수 값을 입력 받기 위해서 a,b 변수를 선언을 하고 그 변수에 입력값을 받습니다.

그 다음 result()함수에서 '몫''나머지' 값을 구해서 출력 합니다.  


정수 값에서는 소수점 이하 값들은 버려집니다. 그래서 나눈 값은 몫만 남게 되는거죠
%는 나머지 값을 구해주는 연산자 입니다.








20151019


*이문제는 Scanner 와 System.out.println() 출력문을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.




섭씨온도를 화씨온도로 변환/CtoF




프로그램 명: CtoF

제한시간: 1 초

섭씨 온도를 화씨 온도로 변환하는 프로그램을 작성하세요.

화씨 온도 = 9 / 5 * 섭씨온도 + 32

입력

1 에서 100 사이의 자연수가 입력으로 주어진다.

출력

소수 첫째 자리까지 출력한다.

입출력 예

입력

50

출력

122.0





문제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);        
	PrintStream p = System.out;
	double a;
	
	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();  
	    ma.temper();
	}
	
	void input(){
		a = sc.nextDouble(); 
	}
	void temper(){
		double tempera = 9/5.0*a + 32;
		p.printf("%.1f",tempera);
	}
}





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

우선 1개의 자연수 값을 입력 받기 위해서 a 변수를 선언을 하고 그 변수에 입력값을 받습니다.

그 다음 temper()함수에서 수식으로 화씨 온도를 구하고 소수점 첫째 자리까지 출력합니다. 


소수점 결과값을 원하기 때문에 9/5 인 부분을 9/5.0 으로 만들어 줬습니다. 이러면 소수점 자리 까지 겨로가값을 얻을 수 있어요.  %.1f 는 오른쪽에 있는 tempera 값을 소수점 1번째 자리까지만 출력한다는 의미 입니다.




20151019


*이문제는 Scanner 와 System.out.println() 출력문을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.




네 수의 평균/average



프로그램 명: average

제한시간: 1 초

네 정수를 입력 받아 평균을 출력하는 프로그램을 작성하세요.

정수 입력 사이에는 공백으로 구분되며 , 평균은 소수 2 째 자리까지 출력하세요.(소수 3 번째 자리에서 반올림)

입력

입력은 1 에서 100 사이의 자연수가 입력된다.

출력

입출력 예

입력

7 7 7 7

출력

7.00

입력

2 5 9 5

출력

5.25


문제 풀이



1) 풀이

import java.util.Scanner;
public class  Main{
   public static void main(String[] args){
     Scanner sc = new Scanner(System.in);
         int a = sc.nextInt();
         int b = sc.nextInt();
         int c = sc.nextInt();
         int d = sc.nextInt();
          
         double result = (a+b+c+d)/4.0;
         result = Math.round(result*100);
         System.out.println(result*0.01);
   }
}

2) 풀이

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

public class Test {
 
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);        
	        PrintStream p = System.out;
	        double a = sc.nextInt(); 
	        double b = sc.nextInt();
	        double c = sc.nextInt();
	        double d = sc.nextInt();    
	        p.printf("%.2f",(a+b+c+d)/4.0);
	}
}




*1번 풀이와 2번 풀이 코드 내용은 같습니다. 다만 2번 풀이는 c언어에서 많이 하는 메타문자를 사용 했습니다.


우선 4개의 자연수 값을 입력 받기 위해서 a,b,c,d 변수를 선언을 하고 그 변수에 입력값을 받습니다.

그 다음 4개의 값을 더하고 4로 나눈 평균 값을 실수형 변수에 저장합니다. 그 다음 방법은 2가지 종류로


1) Math 클래스가 가지고 있는 round() 함수를 사용합니다. 반올림 해주는 함수죠 예)10.6 => 11

원하는 소수점 3번째 자리에서 반올림을 하기위해서 100을 곱해 소수점 2째 자리 까지는 정수형으로 바꿔 줍니다. 그런다음 변수에 저장을 하고 그 값을 다시 0.01을 곱해서 소수점을 복원 시켜 줍니다.


2)C 언어에서 주로 사용하는 개념인듯 합니다. C는 잘 몰라요.

똑같이 더한값을 실수형인 4.0 으로 나눠주면 소수점까지 결과값이 나옵니다. 그걸 %.2f 를 사용해서 소수점 2번째까지만 출력해 주면 됩니다.




20151018


*이문제는 Scanner 와 System.out.println() 출력문을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.




삼각형 넓이 구하기/triangle


프로그램 명: triangle

제한시간: 1 초 

삼각형 넓이를 구하는 문제이다.

넓이 = 밑변 * 높이 / 2

입력

두 자연수가 입력으로 주어진다. 두 수는 1000 이하의 자연수이고 ,차례대로 밑변과 높이이다.

출력

넓이를 소수 이하 2 자리 ( 세 번째 자리에서 반올림 ) 까지 출력한다.

입출력 예

입력

9 83 

출력

373.50



문제 풀이



1) 풀이

import java.util.Scanner;

public class Test {
 
	Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		 Scanner sc = new Scanner(System.in);
	       
		 double bottom = sc.nextDouble();
	     double hight = sc.nextDouble();
	         
	     double area = (bottom*hight)/2;
	     long temp  = (long)(area*100);
	     area = temp*0.01;
	     System.out.println(area);
	}
}

2) 풀이

import java.util.Scanner;

		Scanner sc = new Scanner(System.in);
	double bottom;
	double hight;
	
	public static void main(String[] args) {
		Test ts = new Test();
		ts.input();
		ts.triangle();
	}
	void input(){
		bottom = sc.nextDouble();
		hight = sc.nextDouble();
	}
	void triangle(){
		double area = (bottom*hight)/2.0;
		long temp  = (long)(area*100);
		area = temp;
		area = temp*0.01;
		System.out.println(area);
	}




*1번 풀이와 2번 풀이 코드 내용은 같습니다. 다만 2번 풀이는 함수를 사용했을 뿐이죠.


우선 2개의 자연수 값을 입력 받기 위해서 bottom, hight 변수를 선언을 하고 그 변수에 입력값을 받습니다.

그럼 삼각형의 넓이 = 높이*밑면/2 를 area 변수에 저장하고 100을 곱해서 정수형 변수에 넣어주고 다시 0.01 을 곱해서 소수점 자리가 가능한 double 변수에 저장하고 출력합니다.


여기서 왜 100을 곱했다가 0.01 을 곱해서 다시 원상 복귀 하는지 잘 이해하셔야 합니다.
소수점 자리 값을 정수형으로 형변환을 해주면 소수점 자리값을 버립니다. 이것을 이용해서 소수점 2째 자리까지 남겨야 하기 때문에 소수점 2째 자리를 정수값의 범위안으로 곱해주고  그뒤 형변환을 함으로써 버리려고자 했던  소수점 3째 자리이후로 지워줍니다. 그다음 다시 0.01 을 곱해서 원하는 소수점 2째 자리까지 소수점이 남게 되는거죠.

예) 1.2345     소수점 2째 자리 까지 출력   1.23
   그러면 1.2345 * 100    ->     123.45   ->   정수형   ->   123   ->   123 * 0.01    ->   1.23
   원하는 소수점 2째 자리 까지만 남겨졌습니다.









+ Recent posts