-
[백준, 1008번] 5단계) A/B - JAVA 풀이Algorithm&BAEKJOON(백준)/1단계) 입출력과 사칙연산 2023. 4. 13. 18:15728x90
백준 [1008번] - A/B
https://www.acmicpc.net/problem/1008
1008번: A/B
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
# 문제 해설
A/B [1008] A와 B를 입력받아 A/B를 하여 결과를 내는 것이 목표.
이전 3단계 문제에서 '연산 기호'를 변경해야 한다. ( / )
(기본적으로 1단계에서는 연산 기호(연산자, Operator)에 대한 이해만 있다면 쉽게 해결할 수 있다.)
* Java 연산자(Operator)?
더보기- Operator
: 프로그램 내에서 데이터를 처리해 결과를 도출하는 것을 연산(Operation)이라 하고,
이러한 연산에 사용되는 기호를 연산자(Operator)라고 한다. (연산되는 데이터는 피연산자(Operand)라 한다.)
연산자는 ① 증감 연산자(increment and decrement operator), ② 산술 연산자(arithmetic operator), ③ 시프트 연산자(shift operator), ④ 비교 연산자(comparison operator), ⑤ 비트 연산자(bit operator), ⑥ 논리 연산자(logical operator), ⑦ 조건(삼항) 연산자(ternary operator), ⑧ 대입 연산자(aassignment operator)가 있으며,
우선 순위 또한 ① > ② > ③ > ④ > ⑤ > ⑥ > ⑦ > ⑧ 순서이다. (특수한 경우를 제외하고)
이때, 해당 1단계) 입출력계산 에서는'② 산술 연산자(arithmetic operator)'를 활용하므로, 이에 해당하는 종류를 살펴보겠다.
+ 왼쪽의 피연산자에 오른쪽의 피연산자를 더함. ( A + B , A에 B를 더함 ) - 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌. ( A - B, A에 B를 뺌 ) * 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함. ( A * B, A에 B를 곱함 ) / 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔. ( A / B, A에 B를 나눔 ) % 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함. ( A % B, A에 B를 나누고 남은 나머지 반환 ) [ 참고 및 추가 자료 : TCP SCOOL - 연산자(operator) ]
추가로 이번 문제에는 출력 조건에 '상대 오차'와 '절대 오차'가 나와 있으니, 이에 유의하며 문제에 접근하면 된다.
이번에 사용할 방법 또한,
- Scanner
- BufferedReader
이전 문제와 동일한 방법으로 풀이한다.
# 풀이 - Scanner
* Scanner
: 값을 입력받기 위한 클래스.
//데이터를 입력받기 위한 클래스 import java.util.Scanner; public class Main { public static void main(String[] args) { //선언 Scanner scan = new Scanner(System.in); //System.in -> Byte 단위로 값을 읽음. int A = scan.nextInt(); //공백을 제외해서 읽음, int값을 받아들임. int B = scan.nextInt(); //입력되는 숫자 범위를 지정해줄 수 있다. //if((0<A && A<10) && (0<A && A<10)) { System.out.println(A/B); } //Scanner 사용 후 close() scan.close(); } }
위 방식대로 푸는 경우, 아마 틀린 결과가 나올 것이다. (...)
[1008번] - 오차 범위를 벗어나 틀린 문제 이는 출력 결과에 합당하지 않아 발생한 문제로, 자료형을 변경하여 문제를 해결해주어야 한다.
결론적으로 풀이의 답은 int를 'double'로 변경해야 한다는 것이다.
* Java 정수형 / 실수형 데이터 타입
더보기기존에 사용하던 int형은 '정수형 데이터 타입'으로, 소수점 자리를 표현하지 못해 문제를 해결하지 못했다.
ex> 1 / 3 의 결과 (int)
public class Main { public static void main(String[] args) { int a = 1; int b = 3; System.out.println(a/b); //결과 0 } }
즉, 예제 출력처럼 소수점 자리를 표현하려면 '실수형 데이터 타입'을 사용해야 하므로, int 대신 float, double을 사용하여야 한다.
ex> 1 /3 의 결과 (float)
public class Main { public static void main(String[] args) { float a = 1; float b = 3; System.out.println(a/b); //결과 0.33333334 } }
하지만 float를 사용하여도 원하는 출력값이라고 할 순 없다.
출력 조건을 살펴보면 '소수부분 9번째 자리까지'가 출력 조건이므로, 6자리까지 출력하는 float는 답이 될 수 없다.
ex> 1 / 3 결과 (double)
public class Main { public static void main(String[] args) { double a = 1; double b = 3; System.out.println(a/b); //결과 0.3333333333333333 } }
결론적으로 소수점 15자리까지 출력하는 double이 답이 되는 것을 알 수 있다.
//데이터를 입력받기 위한 클래스 import java.util.Scanner; public class Main { public static void main(String[] args) { //선언 Scanner scan = new Scanner(System.in); //double을 사용해 나눗셈 이후 소수점 자리까지 표현할 수 있도록 함. double A = scan.nextDouble(); double B = scan.nextDouble(); System.out.println(A/B); //Scanner 사용 후 close() scan.close(); } }
# 추가 풀이 (1) - BufferReader
* BufferReader
: Scanner와 유사한 기능 / 버퍼 사용, 속도에 있어 우위
이전 문제에서처럼, [BufferedReader].readLine 로 읽어들일 경우, 행을 모두 읽어오기에 이를 분리해주어야 한다.
- StringTokenizer
- Split()
위의 두가지 방법으로 분리하여 사용하고자 한다. (출력 범위를 고려하며 작성한다!)
방법1. StringTokenizer 사용하기
//BufferedReader를 사용하기 위해 import 한다. import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { //선언 BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); //System.in 대신, Stream, Reader, File이 입력될 수 있다. // (1). String 생성 후 작업하기 String text = read.readLine(); //StringTokenizer - 문자열을 구분자로 쪼개어 저장한다. (토큰(Token) 형태로 저장) StringTokenizer str = new StringTokenizer(text," "); // *** tip. String 선언 없이 사용 가능하다. (15, 18줄 해당) //StringTokenizer st = new StringTokenizer(read.readLine()," "); //Double double a = Double.parseDouble(str.nextToken()); double b = Double.parseDouble(str.nextToken()); System.out.println(a/b); } }
방법2. split() 사용하기
//BufferedReader를 사용하기 위해 import 한다. import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { //선언 BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); //System.in 대신, Stream, Reader, File이 입력될 수 있다. //split()을 사용해 한글자씩으로 쪼갬. String[] str = read.readLine().split(" "); //문자(문자열) 형태로 출력되기에 int로 변환한다. double a = Double.parseDouble(str[0]); double b = Double.parseDouble(str[1]); System.out.println(a/b); } }
728x90'Algorithm&BAEKJOON(백준) > 1단계) 입출력과 사칙연산' 카테고리의 다른 글
[백준, 10869번] 6단계) 사칙연산 - JAVA 풀이 (0) 2023.04.14 [백준, 10998번] 4단계) A×B - JAVA 풀이 (0) 2023.04.13 [백준, 1001번] 3단계) A-B - JAVA 풀이 (0) 2023.04.13 [백준, 1000번] 2단계) A+B - JAVA 풀이 (0) 2023.04.12 [백준, 2557번] 1단계) Hello World - JAVA 풀이 (0) 2023.04.12