20151114


*이문제는 dovelet 에 있는 알고리즘 문제입니다.



층 수 구하기/flr 



프로그램 명: flr

제한시간: 1 초


주희는 심심해서 다음과 같이 수를 쓰기 시작 했다.

이렇게 수를 쓰는 경우 어떤 수가 몇 층에 있는지가 궁금해 졌다.

참고로 100 은 7 층에 존재 한다.

입력

32 비트 정수 범위내의 값이 입력으로 주어진다.

출력

층 수를 출력한다.

입출력 예

입력

100

출력

7

♣n 개의 노드를 가지는 complete binary tree 의 depth 를 구하는 문제입니다.



제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	int n;
	
	public static void main(String[] args) {
		Main m = new Main();
		m.input();
		m.Output();
	}
	void input(){
		n = sc.nextInt();
	}
	void Output(){
		boolean onoff = true;
		int flow = 1;
		while (onoff) {
			if(Math.pow(2, flow) <= n){
				flow += 1;
			}else{
				break;
			}
		}
		p.println(flow);
	}  
}



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


(아래에 보시면 흰트개념이 있는데(log 밑? 값이 2 )를 이용해서 쉽게 풀 수 있습니다.)

그런데 자바에선 log(밑값)2 인 함수를 Math 클래스에서 함수로 제공해주지 않고 또 log2를 어찌 구현해야 할지 몰라서 다른 방식을 이용 했습니다.

위에 문제에서 피라미드를 보시면 층이 생길때마다 그전 층의 2배만큼 커집니다. 그럼 마지막 층은 2의 n승 -1 이 제일 큰수가 되는거죠.

그럼 조건문과 반복문을 이용해서 층을 점점 증가 시키면서  n 값이 증가된 층 값보다 커질때 그전까지 증가했던 층의 수를 출력해주면 됩니다.

말이 더 어렵네요. 그림을 그리고 코드를 따라가면 어렵지 않게 이해할거라 믿어요.ㅎ



아래 흰트 개념이 있습니다. 


흰트 개념을 이용하셔도 쉽게 풀 수 있습니다.

log 를 왜 쓰는지는 아직 이해 못했습니다. 저에게 수학은 정말 힘드네요. :(





흰트 개념


[증명] n 개를 노드를 가진 complete binary tree 의 depth

레벨  에서 가질 수 있는 수의 범위는


양변에 밑을 2 로 하는 log 를 취하면 


1  을 더하면 



    혹은   







20151025


*이문제는 dovelet 에 있는 알고리즘 문제입니다.



약수의 개수가 짝수/even 



프로그램 명: even(open)     

프로그램 명: even(open)
제한시간: 1 초

두 정수 A, B (1 <= A <= B <= 2,000,000,000) 가 주어질때 A 와 B 사이 (A, B 포함) 에 약수의 개수가 짝수인 수의 개수를 출력하시오.

입력

두 정수 A, B 가 주어진다.

출력

약수의 개수가 짝수인 수의 개수를 출력하시오.

입출력 예

입력

3 17

출력 

12
출처:likepad




제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	int a, b;
	
	public static void main(String[] args) {
		Main m = new Main();
		m.input();
		m.Output();
	}
	void input(){
		a = sc.nextInt();
		b = sc.nextInt();
	}
	void Output(){
		int bb = b-(int)(Math.sqrt(b));
		System.out.println((int)(Math.sqrt(b)));
		int aa = (a-1)-(int)(Math.sqrt(a-1));
		p.println(bb-aa);
	}  
}


void Output(){   //처음 문제를 풀때 짝수인 약수를 구별하기 위해서 이런식으로 코딩했었죠. 그냥 참고용 입니다.ㅎ 
	int realSum = 0;
	for(int ta =a; ta <= b; ta++){   // a b 사이 값 하나씩
		int sum = 0;
		for(int taa = 1; taa <= ta; taa++){     // 값 a개 1개를 가져옴
			if(ta%taa == 0){              //a의 소수점 개수를 찾음
				System.out.println(taa);
				sum = sum + 1;
			}
		}
		if(sum%2 == 0){
			realSum = realSum + 1;
		}
	}
	p.println(realSum);
}




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



처음에 for 문으로 풀었더니 시간초과로 틀렸습니다. 식으로 풀게 하는 문제고 흰트가 나와 있는데

루트 값을 정수로 어느시점에 변환 해야 하는지, 소수점 반올림 처리를 해서 정수로 만들어야 하는지

이런 부분에서 오랜시간 고생했던 문제입니다.  


아래 흰트 개념이 있습니다. 


흰트 개념을 보시면 수식은 어렵지 않아요.

흰트 개념에서 설명이 1 부터 n 까지 짝수개인 약수 값이 나오는걸 알려줬지만 우린 a 부터 b 까지의

범위를 알기를 원합니다. 그래서 1부터  b 까지 구한 값에 1부터 a-1 까지(a보다 -1 작은수)구한 값을 빼주기만 하면 됩니다.





흰트 개념


반복문을 사용하면  시간 초과가 납니다.  식으로  답을 구해야 합니다.


1 에서 n 사이 중 약수의 개수가 짝수인 수의 개수를 구하는 문제.



1 에서 n 사이 중 제곱수의 개수는    개 이므로 


예를 들어 ,   1 ~ 17 사이 약수의 개수가 짝수인 수는 







20151024


*이문제는 dovelet 에 있는 알고리즘 문제입니다.



선의 수 구하기/complete_graph 



프로그램 명: complete_graph     

프로그램 명: complete_graph
제한시간: 1 초

꼭지점(vertex)의 수 n 이 주어질 때 임의의 점에서 다른 점으로 바로 가는 길이 존재할 때 선의 수(edge) 을 구하는 것이 문제이다.

n 이 4 이면 6 개의 선이 존재한다.

입력

n 이 주어진다. n 은 2 이상 1000 이하의 정수이다.

출력

선의 수를 출력한다.

입출력 예

입력

4

출력

6
* 이러한 그래프를 완전 그래프(complete graph)라 합니다.





제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	int n;
	
	public static void main(String[] args) {
		Main m = new Main();
		m.input();
		m.Output();
	}
	void input(){
		n = sc.nextInt();
	}
	 void Output(){
		 // 이러한 수식으로도 구할 수 있습니다.  n*(n-1)/2;
		 int sum = 0;
		 int m = n-1;
		 for(int a = 0; a < n-1; a++){
			 sum = sum + m;
			 m = m-1;
		 }
		 p.println(sum);
	 }  
}





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



일정 비율로 선의 개수가 늘어가고 그 규칙을 찾아 수식으로 풀면 되는 문제 입니다.

저는 ..수식을 못 찾고 한 꼭지점부터 그어지는 선의 개수가 n-1 개에서 -1 씩 차감 하면서

1까지 생기는점을 가지고 문제를 풀었습니다.

n*(n-1)/2 이런 수식을 찾는게 더 정석 같은 풀이 같습니다.


20151024


*이 문제는 삼각함수 피타고라스의 정리 을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.



x 길이 구하기/x_length 




프로그램 명: x_length    

제한시간:  1 초

오른쪽 그림과 같은 형식으로 x가 그려질 때, x에 사용되는 곡선과 선분의 길이의 합을 구하는 프로그램을 작성하라.

단, 원주율은 3.14159

입력

첫 번째 줄에 자연수 a와 b가 공백으로 구분되어 주어진다. (1≤a,b≤200)

출력

사용된 길이를 소수점 셋째 자리까지 출력한다.

입출력 예

입력

4 3

출력

31.891
출처:tncks0121(박수찬)




제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	double a, b;
	
	public static void main(String[] args) {
		Main m = new Main();
		m.input();
		m.lengthOutput();
	}
	void input(){
		a = sc.nextDouble();
		b = sc.nextDouble();
	}
	 void lengthOutput(){
		 double c = 3.14159*(a+b);
		 double d = Math.sqrt(2)*(a+b);
		
		 p.printf("%.3f", c+d);
	 }  
}





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



지난 글에서 호도법, 삼각함수 공부를 했었기 때문에 수식은 어렵지 않았습니다. 그런데

소수점 값이 길어지고 그 값들이 더해지는 과정에서 변수 float 과 double 의 차이로

결과 값이 다르게 나오는 경우도 있어서 그 점이 힘들었네요.

그 부분 때문에 다소 시간이 걸렸던 문제였습니다.


원의 반지름을 알고 있으면 원주를 구하는건

 입니다.

그런데 문제에서는 원주 길이의 반 180도만 원하기 때문에

입니다.

그리고 한 원안에 있는 직선은 피타 고라스 정리를 이용해서

 로 반지름 a 인 원에 있는 직선을 구 할 수 있습니다.


파이 값은 문제에서 3.14159 라고 명시해 준 값으로 푸셔야 합니다. 소수점 값이 길어지고

그값들이 더해지는 과정에서 정해진 값과 달라질 수 있습니다.







힌트 개념




그림에서 

곡선의 길이는 큰 원과 작은 원의 반지름의 길이가 a , b 이니 두 원의 원주의 반을 더해 주면 곡선의 길이를 구할 수 있습니다.


직선의 길이는 직각  한 변의 길이가 a 와 b 인 직각이등변 삼각형 이어서 


 가 됩니다.( 피타고라스 정리 참조



20151023


*이 문제는 삼각함수 호도법을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.



정다각형 면적/rpoly 




프로그램 명: rpoly(open)

제한시간: 1 초    

그림과 같이 원안에 있는 정 다각형에서

원의 반지름 r 과 n 각형의 정보가 주어질 때 이 정 다각형의 면적을 구하는 것이다.

입력

실수 r 과 정수 n 이 주어진다. (0 < r < 20000 , 2 < n < 20000)

출력

다각형의 면적을 소수 이하 세자리까지 구한다.

입출력 예

입력

2 2000

출력

12.566

입력

10 3000

출력

314.159
출처: Brightness of Brain Contest 
Suman Mahbub 
Created: 12-09-2002 
Updated: 14-12-2002 
Idea: mAruf Hasan





제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	float r, n;
	
	public static void main(String[] args) {
		Main m = new Main();
		m.input();
		m.polygonsOutput();
		
	}
	void input(){
		r = sc.nextFloat();
		n = sc.nextFloat();
	}
	 void polygonsOutput(){
		 double temp = 0.5*r*r*Math.sin(2*Math.PI/n)*n;
		 p.printf("%.3f", temp);
	 }  
}





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



개인적으로 정말 오래 걸렸던 문제 입니다. 호도법 , 삼각함수 개념을 알고 있어야 하는 문제인데..

둘다 기억이 안났습니다... 덕분에 유튜브로 ebs 강의로 호도법 , 삼각함수를 배우기도 했고 오래걸린

만큼 뿌듯 하네요.


여기서 호도법 , 삼각함수를 간단한 설명은 아래에 소개되어 있습니다.


개념을 안다면

다각형을 삼각형으로 쪼개고 그 삼각형 넓이를 구하는 식은


S = 1/2 *r *r * sin(360/n)

 

입니다.

여기에 n 개를 곱하고 소수점 3자리 수까지 출력하면 됩니다.







힌트 개념



1. 파이 표현

1)삼각 함수 이용하기

그림은 cos 함수 그래프 입니다.

cos pi = -1 이니 cos 함수의 역함수 acos 함수를 이용하여 pi 값을 구할 수 있습니다.

역 함수가 정의되기 위해서는 꺽이는 영역이 없는 증가 구간이나 감소구간에서 정의되므로 cos 의 역함수는 [0,pi] 사이에서 정의됩니다.

1
 

2)매크로 이용하기

1
2
3
4
5
6
7
#include <stdio.h>
#include <math.h>
 
int main()
{
   printf("%lf",M_PI);
}

2.호도법 이해하기

정수로 모든 실수를 표현 못하는 것과 마찬 가지로 도,분,... 등으로 모든 각을 표현할 수는 없습니다. 그래서 나오는 개념이 길이로 각을 표현하자는 것이 호도법입니다.

호도법이란 각의 크기를 단위원(반지름이 1 인 원)의 호의 길이로 나타내는 방법 입니다.

30 도를 호도법으로 나타내면 어떻게 될까요?

30 도일 때 호의 길이가 호도 이므로 2*π*30/360 ..π/6 이 됩니다. 길이 단위이지만 각을 나타낸다 라는 것을 표시하기 하기위해 라디언(radian) 이라 붙여 줍니다. 단위는 아니고 길이인데 각을 나타낸다 정도로 이해하면 됩니다.

180 도는 반원의 호의 길이이므로 π 라디언이 됩니다. 즉 1 도는 π/180 이므로 도를 라디언으로 바꾸기 위해서 π/180 을 곱하면 됩니다.

#include <math.h>

double sin(double x);
float sinf(float x);
long double sinl(long double x);

DESCRIPTION
       The sin() function returns the sine of x, where x is given in radians.
1
2
3
4
5
6
7
#include <stdio.h>
#include <math.h>
 
int main()
{
   printf("%lf",sin(30.0*M_PI/180)); // sin 30 도 구하기
}

3. 넓이 구하기

내접하는 정 n 각형의 한 삼각형의 중심각의 크기는 360/n 도 입니다.

두 변이 주어지고 끼인각을 안다면 삼각형의 면적을 구할 수 있고 , 이 경우 두 변의 길이가 r 이고 끼인 각이 360/n 도 입니다.

하나의 삼각형의 넓이는 S = 1/2 *r *r * sin(360/n) 이고 이 것이 n 개 있으므로 n 을 곱하면 됩니다. 물론 radian 으로 변경해서 프로그램을 해야 합니다.


 


20151023


*이 문제는 삼각형의 비 개념을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.




spot(special judge) spot of light 알고리즘 








프로그램 명: spot(special judge)

제한시간: 1 초


받침대에 있는 프로젝터가 벽 쪽으로 둥글게 빛을 쏜다.

d 가 프로젝터와 벽까지의 수평 거리이고 , r 은 빛이 있는 영역의 반지름이고 A 는 수평각이다. (아래 그림 참조)

우리는 반지름을 p 퍼센트 변화하기를 원한다.

예를 들어, p 가 -25 이면 r 을 25 퍼센트 줄이기를 원한다는 것을 의미한다. 만약 p 가 50 이면 반지름을 50 퍼센트 증가한다는 것이다.

각 A 가 변함이 없다고 가정할 때 얼마나 멀리 그리고 어떤 방항으로 프로젝트를 움직여야 하는지를 알아내어야 한다.

입력

입력은 두 줄로 이루어진다.

  • 한 줄에는 d 가 1 과 40 사이의 실수가 주어지고 ,
  • 다음 줄에는 p 가 -95 와 300 사이의 실수로 주어진다.

출력

프로젝트 위치의 변화를 나타내는 수를 소수 이하 세자리(4 번째 자리에서 반올림) 까지 출력한다.

양수이면 프로젝트를 벽쪽으로 오른쪽으로 가깝게 하는 것을 음수이면 반대 편으로 즉 벽에서 더 멀어지는 것을 의미한다.

입출력 예

입력

28.5
-25.0

출력

7.125

입력

28.5
50.0

출력

-14.250
출처:cs.umd.edu high school programming contest






제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	float d, pRate;
	
	public static void main(String[] args) {
		Main m = new Main();
		m.input();
		m.rateOutput();
		
	}
	void input(){
		d = sc.nextFloat();
		pRate = sc.nextFloat();
	}
	void rateOutput(){
	        float temp = (float)(d*pRate/100);
	        p.printf("%.3f" ,temp*-1);
	    }
}





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



아직까진 어려운 문제는 아니지만 기본적인 수학적인 개념을 알아야 풀 것 같네요.


문제를 먼저 파악해 보면 빛의 수평각 A 는 변함이 없고 주어진 비율 p 만큼 r 이 변하려면


d 는 얼마나 변해야 하냐는 문제 입니다. 수평각 A는 언제나 그대로 면서 r 이 일정 비율만큼


변한다는것은 d그 비율만큼 변한다는 거죠 삼각형을 이루는 3 각의 각도는 언제나 같으니깐요



코딩의 내용은 입력 받은 d 값에 p(비율) 값을 곱해주고
(이때 % 비율로 만들어 주기 위해 100을 나누어 주었습니다.)

그리고 값이 늘어 나면 멀어지는데 값을 음수로 표현 해야하기 때문에 -1 을 곱했고

%.3f 소수점 3번째까지 반올림해 나타내주는 출력문을 사용하면 됩니다.

 




20151022


*이 문제는 내각 외각 개념을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.




angle/open(angle 알고리즘) 








프로그램 명: angle(open)

제한시간: 1 초

n 각형의 내각의 합과 외각의 합을 구하는 문제이다.

입력

n 은 3 이상 20 이하의 정수이다.

출력

내각의 합, 외각의 합을 출력한다.

입출력 예

입력

3

출력

180 360






제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	int x;
	
	public static void main(String[] args) {
		Main m = new Main();
		m.input();
		int iAngle = m.innerAngle();
		int oAngle = m.outerAngle();
		p.println(iAngle + " " + oAngle);
	}
	void input(){
		x = sc.nextInt();   
	}
	int innerAngle(){
		return((x-2)*180);
	}
	int outerAngle(){
		return((180*x)-((x-2)*180));
	}
}





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



수학에서 내각 외각에 대한 개념을 알고 있어야 편한 문제 입니다.

아래 외각의 합, 내각의 합 개념을 써놨습니다. 잘 못 푸시겠으면 개념부터 먼저 보시는것도 좋아요.

외각 내각 개념을 확인 하셨으면 문제는 쉽습니다.

그런데 외각의 합은 항상 360도 이기 때문에 내각의 합만 구하면 되는 문제 였습니다.

저는 외각을 구하는 공식을 썼네요 수학이 약해서ㅠ

내각의 합 구하는 공식 n 각형 (n-2)*180 입니다.




각 (angle)

1. n 각형의 내각의 합

삼각형의 내각의 합은 180 도 4 각형은 삼각형이 2 개 , 5 각형은 3 개 , ... , n 각형은 n-2 개

1
n 각형의 내각의 합은 (n-2)*180 도

2. n 각형의 외각의 합

내외각을 합친 각은 180 도 . n 각형은 n 개의 180 가 나오니 n*180 . 여기에 내각의 합을 빼면 외각의 합이므로

n*180 - (n-2)*180 = 360 도

1
n 각형의 외각의 합은 360 도

3. 접선이 이루는 각

원의 중심에서 접점을 연결하면 이 직선과 접선이 이루는 각은 90 도이다.

이렇게 되는 이유를 알기 위해서는 거리에 대해서 한 번 생각해보자. 거리라 함은 최단 거리를 일컫는다.

  • 점과 점 의 거리는 두 점을 잇는 직선거리이고 이 보다 더 짧은 거리가 있을수 없고
  • 점과 직선 사이의 거리는 점 에서 직선에 내린 수선의 발까지의 거리이고 이 보다 더 짧을 수는 없다. 역으로 점과 직선사이의 거리가 최단거리이면 이는 직각이라고도 할 수 있다.
즉 중심에서 접선으로의 접접을 잇는...

3. 컨베이어 벨트 길이 문제

  • n 각형이 만드는 빨간 원의 각은 360 * n
  • 이중 각 90 도가 2 개 = 180 도가 n 개 있으니 이를 빼고 , 내각의 합을 빼면
    1
    360*n - 180 *n - (n-2)*180 = 360 도





20151022


*이 문제는 함정이 있습니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.




maxandmin/maxandmin 








프로그램 명: maxandmin

제한시간: 1 초

두 개의 정수 x,y에 대해서 max(x,y)는 둘 중 더 큰 수를 이야기하고, min(x,y) 는 둘 중 더 작은 수를 이야기한다.

예를 들면, max(5,3)=5 이고, min(2,1)=1 이다.

이 때 max(min(x,y),x) 를 구하는 것이 문제이다.

입력

두 정수 x,y 가 입력으로 주어진다. (x,y < 2^31)

출력

max(min(x,y),x) 값을 출력한다.

입출력 예

입력

4 3

출력

4
출처:jwvg0425프로그램 명: slant 
제한시간: 1 초


엑스 형은 와이 다.

와이는 엑스 보다 용돈을 매 달 일정한 배수 만큼의 용돈을 더 받는다.

3 배 더 받는경우

  • 엑스가 300 원 받으면 와이는 900 원
  • 엑스가 400 원 받는 달은 와이는 1200 원

그런데 와이가 용돈이 적다고 불만이 많아 받은 금액에서 일정한 액수의 돈을 더 주기로 했다.

100 원 더 준다면

위 예에서는 1000 원 , 1300 원을 받게 된다.

엑스는 와이가 자기보다 용돈을 몇 배 더 받는지가 궁금했지만 형은 가르쳐 주지 않아 이렇게 질문을 했다.

"그러면 형님아 지난 달에 얼마를 , 이 번달에 얼마를 받았는지만 가르쳐 주"

와이 " 가르쳐 줄테니 몇 배 더 받는지는 알려고 하지마!!!"

엑스는 다음의 아이디어로 몇 배를 더 받는지를 알고자 한다.

"비가 같은 것 끼리 빼고 , 더하면 비가 같다 . 그런데 이 경우 빼 버리면 얹어 주는 돈이 없어지니 원하는 결과를 얻을 수 있다"

입력

동생과 형의 받는 용돈 두 번의 금액이 입력으로 주어진다.

출력

몇 배가 되는지를 출력한다. 정수배가 된다는 것은 보장된다.

입출력 예

입력

300 1000
400 1300

출력

3 100
채점데이터:cube






제 풀이



1) 풀이

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

public class Main {
 
	static Scanner sc = new Scanner(System.in);
	static PrintStream p = System.out;
	

	public static void main(String[] args) {
		int x = 0, y = 0;
		x = sc.nextInt();   
		y= sc.nextInt();
	    p.println(x);
	}
}





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



함정 문제 입니다. 넌센스? 같은 문제가 종종 나오네요.

저는 조건문 없이 최대 최소 를 어떻게 구분 할지 한참 고민하다가 그냥 if 문을 썼었는데

문제를 잘 보면 무조건 x 가 출력 되는 문제 입니다.

아직 이런 함정을 잘 보지 못하네요 ㅎㅎ


max(min(x,y),x) 값을 출력 하는데


잘 보면 x 값이 최소 값이여도 x 와 x 중에서 최대값을 출력해야 하니깐 어차피 x 가 나오고

y가 최소 값이 나오면 x 가 더 크다는 소리니깐 x 가 출력 됩니다. 그래서

if 를 안쓰고도 그냥 x만 출력하면 되는거죠.

엉뚱한 곳에서 고민하고 있었네요ㅎㅎ





20151022


*이문제는 가비의 리 개념을 알고 있으면 풀기 편한 문제 입니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.





기울기/slant 








프로그램 명: slant

제한시간: 1 초


엑스 형은 와이 다.

와이는 엑스 보다 용돈을 매 달 일정한 배수 만큼의 용돈을 더 받는다.

3 배 더 받는경우

  • 엑스가 300 원 받으면 와이는 900 원
  • 엑스가 400 원 받는 달은 와이는 1200 원

그런데 와이가 용돈이 적다고 불만이 많아 받은 금액에서 일정한 액수의 돈을 더 주기로 했다.

100 원 더 준다면

위 예에서는 1000 원 , 1300 원을 받게 된다.

엑스는 와이가 자기보다 용돈을 몇 배 더 받는지가 궁금했지만 형은 가르쳐 주지 않아 이렇게 질문을 했다.

"그러면 형님아 지난 달에 얼마를 , 이 번달에 얼마를 받았는지만 가르쳐 주"

와이 " 가르쳐 줄테니 몇 배 더 받는지는 알려고 하지마!!!"

엑스는 다음의 아이디어로 몇 배를 더 받는지를 알고자 한다.

"비가 같은 것 끼리 빼고 , 더하면 비가 같다 . 그런데 이 경우 빼 버리면 얹어 주는 돈이 없어지니 원하는 결과를 얻을 수 있다"

입력

동생과 형의 받는 용돈 두 번의 금액이 입력으로 주어진다.

출력

몇 배가 되는지를 출력한다. 정수배가 된다는 것은 보장된다.

입출력 예

입력

300 1000
400 1300

출력

3 100
채점데이터:cube






제 풀이



1) 풀이

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

public class Main {
 
	Scanner sc = new Scanner(System.in);
	PrintStream p = System.out;
	int underbrother1, olderbrother1, underbrother2, olderbrother2;

	public static void main(String[] args) {
		Main ma = new Main();
	    ma.input();
	    ma.result();
	}
	void input(){
		underbrother1 = sc.nextInt();   //동생
		olderbrother1 = sc.nextInt(); 	//형
		
		underbrother2 = sc.nextInt();   //동생
		olderbrother2 = sc.nextInt(); 	//형
	}
	void result(){
	int x =	(olderbrother2 - olderbrother1)/(underbrother2 - underbrother1);
	p.println(x + " " + (olderbrother1-underbrother1*x));
	}
}





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



생각하는 시간이 좀 걸려던 문제 입니다. 대다수가 '가비의 리' 개념을 사용해서 쉽게 풀었습니다.


저는 '가비의 리' 개념을 몰라서 미지수 2개 식2개 로 미지수를 구하는 방식으로 풀었습니다.


우선 동생돈 형돈 값이 총 2번 입력 되어집니다.


방정식을 만들어 보면


형돈 = 동생돈 * 배수 + 추가돈


입니다.


이 방정식에서 형돈과 동생돈을 알려주므로 미지수는 배수와 추가돈 이죠
입력 값을 예로 풀어볼게요.

예)
300 1000
400 1300

1000(형돈) = 300(동생돈)*X(배수) + a(추가돈)
1300(형돈) = 400(동생돈)*X(배수) + a(추가돈)

공통 미지수인 a(추가돈)만 남기고 수식을 정리하면

1000 - 300*X = a
1300 - 400*X = a

그렇다는건

1000 - 300*X = 1300 - 400*X     

라는거죠 미지수 X 만 남기고 수식을 정리하면
400*X - 300*X = 1300 - 1000
(400 - 300)*X = 1300 - 1000
 X = (1300 - 100)/(400 - 300)

이렇게 됩니다. 미지수 X 배수 를 알 수 있습니다.

추가 돈은 동생돈에서 배수를 곱한걸 형돈에서 빼주면 알 수 있겟죠

저는 나름 고민하다가 이런식으로 풀었습니다. 그런데 '가비의 리' 개념을 알면 더 쉽게
풀엇을것 같네요. 아래는 가비의 리 개념 입니다.




가비의 리

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

가비의 리(加比의理, 표준어: 가비의 이)란 두 쌍 이상의 수의 가 서로 같을 때, 비례식의 왼쪽 항들의 합과 오른쪽 항들의 합도 다시 그 비율이 된다는 정리이다. 즉,

{a : A} = {b : B} = {c : C}
= {(a+b+c) : (A+B+C)}

이다.

이 정리는 매개변수를 이용하여 간단히 증명되는데,

{a : A} = {b : B} = {c : C} = k : 1

이라고 하면,

a = kA
b = kB
c = kC

이므로,

{(a+b+c) : (A+B+C)}
= {(kA+kB+kC) : (A+B+C)}
= {{k(A+B+C)} : (A+B+C)} = k : 1

으로 증명된다.








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






+ Recent posts