
>>문제 바로가기<<
간단해 보이는데 생각보다 정답률이 낮은 문제입니다. (34.5%)
제가 보기에 보이는 포인트는
_1. int로 변수를 선언하는 경우
_2. 절대오차와 상대오차
_3. 소수점 맞추기
로 나눠볼 수 있겠습니다.
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.
백준 1008번의 문제입니다.
변수를 int로 선언해야 하겠죠?
정수를 받으라 했으니 int부터 떠올리는게 자연스럽겠죠.

하지만 문제의 예제출력을 보면
소수점으로 출력시켜야 하는것을 알 수 있습니다.
때문에 변수를 int가 아닌 float 또는 double로 선언하고
거기다 정수를 입력하는 방식입니다.
▶절대오차
절대오차는 근삿값과 참값의 차이를 의미합니다.
절대오차 = |근삿값 - 참값|
예를들어,
시험공부를 열심히 해서 100점이 나올 줄 알았는데
실제로 시험을 보니 60점이 나왔습니다.
이때 참값(실제 값)은 60점이고, 근삿값(예상한 값)은 100점입니다.
여기서 절대오차는
근삿값(100점) - 참값(60점) = 40점(절대오차)입니다.
▶상대오차
상대오차는 절대오차를 참값으로 나눈 값입니다.
상대오차 = 절대오차/참값
시험점수의 절대오차(예상한 값과 실제 값의 차이)가 40점,
참값(실제 값)이 60점이므로
상대오차는 40/60 = 0.6667입니다.
백분율 %로 나타내려면 x100을 곱하면 되므로
66.67%라는 수치가 나오게됩니다.
즉, 시험점수가 예상점수(100점)보다 66.67% 낮은 점수(60점)가 나왔다!
라고 볼 수 있습니다.
첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.
그럼 이제 이 개념을 문제에 적용해볼까요?
절대오차 또는 상대오차가 10-9 이하이면 정답이다.
이게 대체 무슨 뜻일까요?
10-9는 굉장히 작은 수죠?
즉 값을 측정했더니 오차가 굉장히 작다는 뜻이므로
근삿값이 참값과 거의 동일한 수준으로 비슷하다는 걸 나타냅니다.
시험점수 100점을 예상했더니 실제 점수 99점을 받게되면
근삿값(100점)과 참값(99점)이 거의 비슷하다고 할 수 있겠죠?
즉 두 숫자의 차가 작으면 작을수록 오차가 줄어든다는 뜻입니다.
문제에서 10-9이하라고 했으니
10-10, 10-11, ...
점점 숫자가 작아지는것이 정답입니다.
숫자가 작아질수록 오차도 작아짐을 의미합니다.
이제 오차가 최대한 작아야하는건 알았습니다.
그럼 변수를 어떻게 받아야 오차가 최대한 작아질까요??
1.int로 변수를 선언하는 경우
에서 변수를 float 또는 double로 받아야 한다는 건 알았습니다.
그럼 둘 중 어느걸 써야할까요?
float의 표현 가능 소수점 자리는 약 7자리
double의 표현 가능 소수점 자리는 약 14~15자리
즉 float으로는 10-9이하로 표현할 수 없다는것이죠.
10-7이 10-9보다 크잖아요?
저희가 구하는건 작은 수인데 말이죠.
따라서 변수선언은 double로 해야합니다.
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in); // Scanner 선언
double A, B; // double로 A,B 변수 선언
A = scan.nextDouble(); // A에 값 저장
B = scan.nextDouble(); // B에 값 저장
System.out.print(A/B); // A/B를 출력
}
}
해당 코드를 입력하면 성공적으로
"맞았습니다!!"
해당 메세지를 볼 수 있습니다.
감사합니다.