개발자는 기록이 답이다
[백준/BOJ][Java][11720] 숫자의 합 본문
2023.08.21 - [알고리즘/백준] - Java, String의 constant pool과 Heap의 차이
https://www.acmicpc.net/problem/11720
간단하게 입력받은 문자 숫자를 숫자로 형변환해서 다 더해주는 문제이다.
나는 Scanner밖에 안써봤는데 문자열을 입력받을때 다른 방법이 있는 것 같다.
내가 푼 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
String num = sc.next();
int ans = 0;
String[] split = num.split("");
for (String numStr : split) {
ans += Integer.valueOf(numStr);
}
System.out.println(ans);
}
}
메모리 | 시간 | 언어 | 코드 길이 |
17748KB | 208ms | Java11 | 398B |
다른 사람이 푼 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
char[] numbers = br.readLine().toCharArray();
int total = 0;
for (int i = 0; i < N; i++) {
total += Integer.parseInt(String.valueOf(numbers[i]));
}
System.out.println(total);
}
}
메모리 | 시간 | 언어 | 코드 길이 |
12904KB | 68ms | Java8 | 460B |
내가 푼 풀이와 다른 사람 풀이 비교
BufferedReader:
- BufferedReader는 문자 입력 스트림을 버퍼링하여 읽어오는 클래스이다.
- 버퍼링은 입출력의 성능을 향상시키는데 도움을 준다. 한 번에 많은 양의 데이터를 읽어와서 버퍼에 저장하므로 실제 I/O 작업을 줄일 수 있다.
- 보통 InputStreamReader와 함께 사용하여 입력 스트림을 문자 스트림으로 변환한 후 BufferedReader를 통해 읽어온다.
- 문자열을 읽어오는 메서드(readLine())를 제공하므로 편리하게 문자열을 처리할 수 있다.
- 주로 텍스트 파일 등의 텍스트 데이터를 읽어올 때 사용된다.
InputStreamReader:
- InputStreamReader는 바이트 입력 스트림을 문자 입력 스트림으로 변환하는 클래스이다.
- 바이트 단위로 데이터를 읽어오는 스트림을 문자 단위로 변환하여 읽어올 수 있게 해준다.
- BufferedReader와 함께 사용하여 버퍼링된 문자열을 효율적으로 읽어올 수 있다.
Scanner:
- Scanner는 다양한 형식의 입력 데이터를 읽어오기 위한 클래스이다.
- 문자열, 숫자, 정규 표현식 등 다양한 데이터를 파싱하여 읽을 수 있다.
- 기본적으로 공백 문자를 기준으로 데이터를 나눠 읽기 때문에, 편리하게 입력을 처리할 수 있다.
- 그러나 다양한 파싱 작업 때문에 BufferedReader에 비해 입출력 속도가 느릴 수 있다.
- 작은 규모의 입력 처리나 간단한 파싱 작업에 적합하다.
요약하자면, BufferedReader는 대용량의 텍스트 데이터를 효율적으로 처리하기 위해 사용되며, InputStreamReader와 함께 사용하여 문자 스트림으로 변환된 데이터를 읽어온다. 반면 Scanner는 다양한 형식의 입력 데이터를 파싱하고 처리하기 위해 사용되며, 비교적 간단한 작업에 적합합니다.
BufferedReader가 Scanner보다 성능적인 면에서 더 낫다. 더 빠른 속도로 입력을 처리할 수 있고, 입력이 매우 큰 경우에도 처리할 수 있는 효율성을 가지고 있다. Scanner를 사용하여 입력을 받아오기 때문에 사용하기 간편하지만, BufferedReader에 비해 약간 느린 속도로 입력을 처리한다.
BufferedReader가 입력 버퍼를 사용하여 문자열을 읽어오는 반면, Scanner는 정규 표현식을 사용하여 파싱하고 토큰화하기 때문이다.
BufferedReader는 입력 스트림을 버퍼에 저장하여 한 번에 읽어오는 방식으로, I/O 작업을 줄여 입출력 속도를 향상시킵니다. 이에 비해 Scanner는 입력을 더 자세하게 파싱하고 처리하기 위해 정규 표현식을 사용하므로, 입력 처리가 상대적으로 더 느릴 수 있다. 작은 입력에 대해서는 문제 없이 동작하지만, 큰 입력이 주어지는 경우 성능 저하가 있을 수 있다.
하지만, 입력의 크기가 크지 않아서 큰 차이가 없을때는 일반적으로는 입출력 속도보다도 코드의 가독성과 유지보수성을 중요시해야 한다.
흠 근데, 시간 테스트를 해봤는데 Scanner가 더 빠를때도 있는거 같고, 별로 차이 안나는데 이렇게 성능 테스트하는게 아닌건가..?
BufferedReader가 성능이 더 좋다는걸 코드상으로 어떻게 테스트해볼 수 있을까?
System.currentTimeMillis();
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
Scanner sc = new Scanner(System.in);
String num = sc.next();
int ans = 0;
String[] split = num.split("");
for (String numStr : split) {
ans += Integer.valueOf(numStr);
}
long end = System.currentTimeMillis();
System.out.println(ans);
System.out.println("Scanner Time: " + (end - start) + " ms");
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderTest {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] numbers = br.readLine().toCharArray();
int total = 0;
for (int i = 0; i < numbers.length; i++) {
total += Integer.parseInt(String.valueOf(numbers[i]));
}
long end = System.currentTimeMillis();
System.out.println(total);
System.out.println("BufferedReader Time: " + (end - start) + " ms");
}
}
참고 링크 :
https://www.acmicpc.net/blog/search/%EC%9E%85%EB%A0%A5+%EC%86%8D%EB%8F%84
https://carpediem0212.tistory.com/11
https://studywithus.tistory.com/61
https://dlee0129.tistory.com/238
'알고리즘 > 백준' 카테고리의 다른 글
[백준/BOJ][Java][13223] 소금 폭탄 (0) | 2023.08.24 |
---|---|
[백준/BOJ][Java][1543] 문서 검색 (0) | 2023.08.23 |
[백준/BOJ][Java][1157] 단어공부 (1) | 2023.08.22 |
[백준/BOJ][Java][1919] 애너그램 만들기 (0) | 2023.08.21 |
[백준/BOJ][Java][2744] 대소문자 바꾸기 (0) | 2023.08.21 |