20151126


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



분수 크기 비교/compare 



프로그램 명: comparefrac

제한시간: 1 초


a/b 와 c/d 의 대소를 판단하는 프로그램이다.

입력

자연수 a , b, c ,d 가 입력으로 주어진다. 입력되는 수는 10000 이하이다.

출력

  • a/b > c/d 이면 1
  • a/b = c/d 이면 0
  • a/b < c/d 이면 -1

을 출력한다.

입출력 예

입력

3 4 5 6

출력

-1




제 풀이



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;
    double b;
    double c;
    double d;
      
    public static void main(String[] args) {
        Main m = new Main();
        m.input();
        m.Output();
    }
    void input(){
        a = sc.nextInt();
        b = sc.nextInt();
        c = sc.nextInt();
        d = sc.nextInt();
    }
    void Output(){
        a = a/b;
        c = c/d;
        if(a > c){
            p.print("1");
        }else if(a == c){
            p.print("0");
        }else{
            p.print("-1");
        }
    }  
}




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


분수의 크기를 비교하는 문제 입니다. 정수형인 int 값으로 분수 형태를 저장하게 되면 몫

나눈 몫 값만 남게 되기 때문에 분수의 크기를 비교 할 수 없습니다. 그래서 저는 실수 값도 받는

Double 형으로 받아서 문제를 해결했습니다.


좀 더 수학적인 방법으로는 아래와 같은 흰트 개념을 참고해서 분수의 크기를 정수로 처리가 가능합니다.
컴퓨터에서 가능하면 실수처리를 피하는게 좋다고 하니 흰트 개념을 잘 이용해 보세요.



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




흰트 개념



분수크기 비교 hint

입력되는 수가 정수이므로 정수로 입력을 받습니다.   
1
scanf("%d %d %d %d",&a,&b,&c,&d); //  a/b , c/d
두 분수를 통분하면

b*d 의 부호는 양수이므로 분자의 a*d - b*c 가 양수인지 0 인지 음수인지만 판단하면 됩니다.

컴퓨터에서 정수처리가 가능하다면 실수처리를 피하는 게 좋습니다. 실수연산의 결과는 완전히 신뢰할수가 없습니다.






20151124


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



대소 판별하기/compare 



프로그램 명: compare

제한시간: 1 초


두 정수를 입력으로 받아

  • 앞수가 뒷수 보다 크면 >
  • 앞수가 뒷수 보다 작으면 <
  • 같으면 =

를 출력하는 프로그램을 작성하세요.

입출력 예

입력

3 4

출력

<

입력

4 4

출력

=





제 풀이



1) 풀이

import java.io.PrintStream;
import java.util.Scanner;
  
public class Main {
   
    Scanner sc = new Scanner(System.in);
    static PrintStream p = System.out;
    int n1;
    int n2;
      
    public static void main(String[] args) {
        Main m = new Main();
        m.input();
        m.Output();
    }
    void input(){
        n1 = sc.nextInt();
        n2 = sc.nextInt();
    }
    void Output(){
        if(n1 > n2){
            p.print(">");
        }else if(n1 < n2){
            p.print("<");
        }else{
            p.print("=");
        }
    }
  }




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


간단한 조건문인 if 문법만 알면 푸는 문제 였습니다.ㅎ

풀이가 필요없죠.


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  을 더하면 



    혹은   







+ Recent posts