본문 바로가기
IT개발/코딩테스트 연습

백준 1008번 - 자바(java/알고리즘/코딩테스트 연습/연산자)

by 시간기억자 2024. 12. 4.
반응형

문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.

예제 입력 1

1 3

예제 출력 1 

0.33333333333333333333333333333333

10-9 이하의 오차를 허용한다는 말은 꼭 소수 9번째 자리까지만 출력하라는 뜻이 아니다.

예제 입력 2 

4 5

예제 출력 2 

0.8

 

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        double a=sc.nextDouble();
        double b=sc.nextDouble();
        
        System.out.println(a/b);
        
        sc.close();
    }
}

 

어떻게 보면 매우 기초적이고 쉬운 문제인데 그렇다고 아무 생각없이 풀면 틀릴 수 있다.

문제를 보면 '두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.' 라고 되어있는데, 이것만 보고 아무 생각 없이 두 정수에 대한 변수의 자료형을 'int'로 하게 되면 두 값을 나눈 값도 '정수'로 나오기 때문에 답이 틀리게 된다.

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt(); //만약 a에 20을 입력
        int b=sc.nextInt(); //만약 b에 3을 입력
        
        System.out.println(a/b); //결과는 소수점이 버려진 정수 6이 나온다
        
        sc.close();
    }
}

 

그렇기 때문에

 

int a=sc.nextInt(); 
int b=sc.nextInt();

 

이게 아니라

 

double a=sc.nextDouble();
double b=sc.nextDouble();

 

이렇게 써야 하는 것이다.

 


그럼 여기서 float 자료형은 왜 안될까?

float이 안되는 이유는 정밀도 때문이다.

실수값을 표현하기 위한 자료형 - float(4Byte), double(8Byte)

float b1=1.23456789; 
//이 경우 8Byte(double) 값을 4byte 자료형에 저장하려고 해서 에러남

 

float b1=1.23456789F; ==> 가수부로 표현 가능한 크기(정밀도) : 소수점 7자리

double b2=1.23456789; ==> 가수부로 표현 가능한 크기(정밀도) : 소수점 15자리

 

float를 사용할 때는 정밀도에 주의해야 한다.

특히, 나눗셈의 결과가 소수점 이하 9자리 이상의 정확도를 요구하는 경우, float로는 충분하지 않을 수 있다.

반응형

댓글