[백준] 1008번 : A/B - JAVA [자바]
https://www.acmicpc.net/problem/1008
-
문제
매우 간단한 문제다!
다만 주의할 것이라면 입력이 공백 단위로 주어진다는 점과
출력 조건에 나와있듯이 상대오차 또는 절대오차 범위 이하여야 한다.
- 2가지 입력방법을 이용하여 풀이한다.
Scanner 로 입력받아 연산하는 방법과 BufferedReader 로 입력받아 연산하는 방법, 두 가지 방법을 통해 풀이해보고자 한다.
위 방법은 앞서 포스팅에서도 언급했으니 만약 쓰는 방법을 모른다면 아래 링크를 통해 읽어보는 것을 추천한다.
※Scanner 와 BufferedReader 의 입력방법에 대해 알아보고자 한다면 아래 링크의 포스팅을 보면 된다.
- 풀이
- 방법 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
double a=in.nextDouble();
double b=in.nextDouble();
in.close();
System.out.print(a/b);
}
}
가장 기초적인 입력방법이다.
그리고 문제에 나와있듯이 오차 범위를 벗어나지 않게 하기 위해서는 반드시 double형으로 출력을 해주어야 한다.
- 방법 2
BufferedReader 을 쓰는 방식이다.
readLine() 을 통해 입력 받아 연산하는 방법 두 가지를 설명할 것이다.
앞서 말했듯이 readLine() 은 한 행을 전부 읽기 때문에 공백단위로 입력해 준 문자열을 공백단위로 분리해주어야 문제를 풀 수 있을 것이다.
문자열 분리 방법 두 가지로 풀어보자.
- StringTokenizer 클래스를 이용하여 분리해주는 방법
- split() 을 이용하는 방법
그리고 반드시 자료형 타입을 잘 보아야 한다.
st.nextToken() 은 문자열을 반환하니 Double.parseDouble()로 double 형으로 변환시켜준다.
// 방법 2-1
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 br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str," ");
double a = Double.parseDouble(st.nextToken());
double b = Double.parseDouble(st.nextToken());
System.out.println(a/b);
/*
굳이 String 변수 생성 안하고 입력과 동시에 구분자로 분리해줘도 된다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
double a = Double.parseDouble(st.nextToken());
double b = Double.parseDouble(st.nextToken());
System.out.println(a/b);
*/
}
}
두 번째 방법은 br.readLine() 을 통해 읽어온 것을 split(" ") 하여 공백 단위로 나눠준 뒤 String 배열에 각각 저장하는 방법이다.
그렇게 저장된 배열 원소를 하나씩 꺼내 double형으로 변환해주어야 한다.
// 방법 2-2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
double a = Double.parseDouble(str[0]);
double b = Double.parseDouble(str[1]);
System.out.println(a/b);
}
}
- 성능 차이
위에서 부터 순서대로
채점 번호 : 17508533 - BufferedReader + split() 사용
채점 번호 : 17508519 - BufferedReader + StringTokenizer 사용
채점 번호 : 17508512 - Scanner 사용
시간을 보면 BufferedReader 와 Scanner 의 성능차이가 확연하게 나는 것을 볼 수가 있다.
위에 두 개의 시간 차이는 서버 차이인지 아니면 split 과 StringTokenizer 의 성능차이인지 알 수는 없으나 데이터가 많아지면 많아질 수록 StringTokenizer가 split 메소드보다 성능이 우월하니 참고하면 좋을 것 같다.
- 정리
앞서 A+B 에서 풀이 방법은 다 언급해서 이번 A/B 글은 짧게 썼다.
그래도 여러분이 한 번쯤은 A+B 의 글을 봐주셨으면 하며 링크는 포스팅 앞부분에 언급했으니 참고하시길 바란다.
혹시 궁금한 점이 있다면 언제든 댓글 달아주셔도 된다. 아는 선에서 최대한 알려주도록 필자 또한 노력하겠다.
'JAVA - 백준 [BAEK JOON] > 입출력과 사칙연산' 카테고리의 다른 글
[백준] 10430 번 : 나머지 - JAVA [자바] (6) | 2020.02.09 |
---|---|
[백준] 10869번 : 사칙연산 - JAVA [자바] (8) | 2020.02.08 |
[백준] 10998번 : A×B - JAVA [자바] (0) | 2020.02.07 |
[백준] 1001번 : A-B - JAVA [자바] (0) | 2020.02.06 |
[백준] 1000번 : A+B - JAVA [자바] (25) | 2020.02.06 |