https://www.acmicpc.net/problem/1330
백준 1330번 문제를 2가지 방법으로 풀어봤다.
- BufferedReader (+ StringTokenizer)
- Scanner
Answer 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 inputLine = br.readLine();
StringTokenizer input = new StringTokenizer(inputLine, " ");
int inputA = Integer.parseInt(input.nextToken());
int inputB = Integer.parseInt(input.nextToken());
br.close();
String result = "";
if(inputA >= -10000 && inputB <= 10000) {
if(inputA > inputB) result = ">";
else if(inputA < inputB) result = "<";
else result = "==";
System.out.println(result);
}
}
}
Code Explanation
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
사용자로부터 입력을 바이트 단위로 받기 위해 입력 스트림 `System.in`을 사용했다.
BufferedReader 클래스는 Scanner 클래스 보다 효율적인 메모리 용량을 가진다.
Scanner vs BufferedReader
2023.10.24 - [Study(JAVA)] - [Study(JAVA)] Scanner vs BufferedReader
StringTokenizer input = new StringTokenizer(inputLine, " ");
입력받은 문자열 한 행에서 문자를 분리하기 위해 StringTokenizer 클래스를 사용하여 공백을 기준으로 문자열을 나눈다.
해당 백준 문제 같은 경우, 배열로 반환되는 split() 메서드 보다 데이터를 바로 분리하여 반환해 주는 StringTokenizer 클래스가 유용하다.
StringTokenizer vs Split
2023.10.24 - [Study(JAVA)] - [Study(JAVA)] StringTokenizer vs Split
Answer 2
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int inputA = input.nextInt();
int inputB = input.nextInt();
input.close();
String result = "";
if(inputA >= -10000 && inputB <= 10000) {
if(inputA > inputB) result = ">";
else if(inputA < inputB) result = "<";
else result = "==";
System.out.println(result);
}
}
}
Code Explanation
Scanner scanner = new Scanner(System.in);
사용자로부터 입력을 바이트 단위로 받기 위해 입력 스트림 `System.in`을 사용했다.
입력받은 데이터를 원하는 타입으로 변환하여 사용하기 위해 `Scanner` 클래스를 사용했다.
Code Explanation(공통)
.close();
위와 같은 표준 입출력(키보드 입력)에서 큰 문제는 없다.
하지만, resource(DB, Network, File) 데이터들에 대한 입출력에서는 resource 손상이 발생할 수 있다.
따라서, `close()`를 사용하여 resource를 반환해 주는 것이 좋다.
close()를 습관화 하도록 하자.
if(inputA >= -10000 && inputB <= 10000) {
if(inputA > inputB) result = ">";
else if(inputA < inputB) result = "<";
else result = "==";
System.out.println(result);
}
문제에서 '-10,000 ≤ A, B ≤ 10,000' 제한이 있어서 크게 한 번 묶어주고, 나머지 3가지 조건들을 그 안에 분기처리 해 주었다.
`(inputA > inputB) ? ">" : ((inputA < inputB) ? "<" : "==")`처럼 삼항연사자로 3가지 조건들을 한 번에 처리할 수 있다. 그러나, 내 생각에는 한 번의 삼항연산자는 가독성을 높일 수 있지만, 2중 삼항연산자는 오히려 가독성을 떨어뜨릴 수 있다고 생각해서 3가지 조건으로 분기처리 해 주었다.
Comparison
사용된 메모리를 보면 Scanner 클래스와 BufferedReader 클래스의 성능 차이가 느껴진다.
따라서, Scanner 클래스보다 BufferedReader 클래스를 사용하는 것이 성능이 우수할 것 같다.