

✅ 문제
빠르게 입력받고 출력하는 문제
📥 입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
📥 출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
💡 풀이
- 시간제한은 1.5초다. 따라서 Scanner를 사용하면 시간초과로 오답처리 된다.
- System.out.printn 도 사용하면 시간초과된다.
1000만개의 숫자를 입력 받을 때 기준으로 Scanner를 이용하면 수행시간 6초 걸린다. 하지만 BufferedReader을 사용하면 0.9초 밖에 걸리지 않는다. 이처럼 Scanner와 BufferedReader의 속도는 크게 차이난다, 따라서 입력이 많은 알고리즘을 풀 때는 BufferedReader을 사용해 주어야 한다. 또한 이 문제의 입력에는 최대 100만개의 테스트 케이스가 주어질 수 있다고 명시되어 있다. 케이스가 늘어나면 늘어날 수록 생기는 문제점은 System.out.println()의 호출 횟수가 계속 증가해서 시간초과가 난다는 것이다. 그래서 BufferedWriter를 사용해서 풀어야만 하는 문제이다.
💡 그렇다면 Scanner은 왜 BufferedReader보다 느릴까?
Scanner의 버퍼 사이즈는 1,024개의 문자를 저장할 수 있는 반면, BufferdReader는 8,192개의 문자를 저장할 수 있다. 따라서 버퍼 크기가 더 작은 Scanner는 더 빈번히 버퍼를 비워주어야 하기 때문에 속도가 더 느리다. 또 Scanner는 입력 받을 때 정규식을 이용하여 입력 값을 파싱한다.
예를 들면, 1,234,567처럼 숫자 사이에 콤마가 있어도 정규식을 통해 정수로 파싱하는 과정을 거친다. 즉, 버퍼 사이즈가 작고, 정규식을 이용하여 입력 값을 파싱하는 과정 때문에 Scanner가 BufferedReader보다 더 느린 것이다.
BufferedReader를 사용할 때는 보통 readLine()를 이용해서 라인 단위로 입력 받는다. readLine()은 개행을 끝으로 하는 문자열을 읽어와서 개행을 제외한 문자열을 반환한다. BufferedReader를 사용할 때는 split 또는 StringTokenizer를 사용하여 입력받은 것을 쪼개고, 필요에 따라 int형 등으로 형변환해서 사용한다.
Java 입출력, Scanner와 BufferedReader의 비교
https://codingnotes.tistory.com/216 Java 입출력 (스트림, 버퍼) 스트림(Stream)이란? 먼저, 스트림 이란? 연속적인 데이터의 흐름 또는 데이터를 전송하는 소프트웨어 모듈을 의미합니다. 아래 그림처럼, 자
codingnotes.tistory.com
(4) 자바 BufferedReader 와 Scanner
Scanner 란? : Scanner 란 사용자에게 입력 장치로 입력을 받아 그 값을 변수에 저장하는 역할을 한다. ...
blog.naver.com
💡 StringTokenizer, StringBuilder, BufferedWriter
StringTokenizer:
- 장점:
- 문자열을 특정 구분자(delimiter)를 기준으로 쪼개어 처리할 수 있다. 이는 문자열을 빠르게 특정 패턴에 따라 분할할 수 있다는 것을 의미한다.
- 기본 자료형인 int, double 등의 형태로 쉽게 변환할 수 있다.
- 단점:
- 구분자를 기준으로 문자열을 분리하므로, 정확한 구분자를 지정해주어야 한다.
- 불필요한 메모리 사용이 발생할 수 있다. (예: Integer.parseInt() 메서드를 사용하여 문자열을 int로 변환하는 과정에서)
StringBuilder:
- 장점:
- 문자열을 수정할 때 매번 새로운 객체를 생성하지 않고 기존의 문자열에 수정을 가할 수 있다. 이는 메모리와 성능 면에서 이점을 가져온다.
- 문자열 결합 연산(+)을 반복적으로 수행할 때 효율적이다
- 단점:
- 여러 스레드에서 동시에 StringBuilder를 수정하려고 하면 예기치 않은 결과가 발생할 수 있다.
BufferedWriter.write():
- 출력할 때마다 바로 출력이 되는 것이 아니라, 내부의 버퍼에 쌓인 뒤에 한 번에 출력된다. 이는 출력 성능을 향상시키는 데 도움이 된다. write() 메서드는 문자열 외에도 문자(char), char 배열, 문자열의 일부분, 줄 바꿈 등을 출력할 수 있으며, flush() 메서드를 호출하여 버퍼를 비워주어야 실제 출력이 이루어진다.
✅ 풀이 코드 : StringTokenizer + BufferedWriter
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
StringTokenizer st; // 문자열 분리를 위해 StringTokenizer을 생성
for(int i = 0; i< T; i++) {
st = new StringTokenizer(br.readLine()," ");
// StringTokenizer을 생성해주면서 문자를 입력받는것을 반복
bw.write((Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken()))+"\n");
// StringTokenizer 토큰(=분리된 문자) 반환
// String 이므로 반환되므로 계산을 위해 정수형으로 형번환 (Integer.parseInt 사용)
// 형변환된 토큰 두 개를 더해준 값을 BufferedWriter.write() 에 담기
}
br.close(); // 자원 해제
bw.flush(); // 버퍼 비우기
bw.close(); // 자원 해제(버퍼 닫기)
}
}
✅ 풀이 코드 : StringTokenizer + StringBuilder
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()," ");
sb.append(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())).append('\n');
}
br.close();
System.out.println(sb);
}
}
'코딩테스트 > BaekJoon' 카테고리의 다른 글
[백준] 11022번 : A+B-8 자바 / java (1) | 2024.04.23 |
---|---|
[백준] 11021번 : A+B-7 자바 / java (1) | 2024.04.23 |
[백준] 25314번 코딩은 체육과목 입니다 - 자바 / java (0) | 2024.04.12 |
[백준] 25304번 영수증 - 자바 / java (0) | 2024.04.12 |
[백준] 8393번 합 - 자바 / java (0) | 2024.04.12 |


✅ 문제
빠르게 입력받고 출력하는 문제
📥 입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
📥 출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
💡 풀이
- 시간제한은 1.5초다. 따라서 Scanner를 사용하면 시간초과로 오답처리 된다.
- System.out.printn 도 사용하면 시간초과된다.
1000만개의 숫자를 입력 받을 때 기준으로 Scanner를 이용하면 수행시간 6초 걸린다. 하지만 BufferedReader을 사용하면 0.9초 밖에 걸리지 않는다. 이처럼 Scanner와 BufferedReader의 속도는 크게 차이난다, 따라서 입력이 많은 알고리즘을 풀 때는 BufferedReader을 사용해 주어야 한다. 또한 이 문제의 입력에는 최대 100만개의 테스트 케이스가 주어질 수 있다고 명시되어 있다. 케이스가 늘어나면 늘어날 수록 생기는 문제점은 System.out.println()의 호출 횟수가 계속 증가해서 시간초과가 난다는 것이다. 그래서 BufferedWriter를 사용해서 풀어야만 하는 문제이다.
💡 그렇다면 Scanner은 왜 BufferedReader보다 느릴까?
Scanner의 버퍼 사이즈는 1,024개의 문자를 저장할 수 있는 반면, BufferdReader는 8,192개의 문자를 저장할 수 있다. 따라서 버퍼 크기가 더 작은 Scanner는 더 빈번히 버퍼를 비워주어야 하기 때문에 속도가 더 느리다. 또 Scanner는 입력 받을 때 정규식을 이용하여 입력 값을 파싱한다.
예를 들면, 1,234,567처럼 숫자 사이에 콤마가 있어도 정규식을 통해 정수로 파싱하는 과정을 거친다. 즉, 버퍼 사이즈가 작고, 정규식을 이용하여 입력 값을 파싱하는 과정 때문에 Scanner가 BufferedReader보다 더 느린 것이다.
BufferedReader를 사용할 때는 보통 readLine()를 이용해서 라인 단위로 입력 받는다. readLine()은 개행을 끝으로 하는 문자열을 읽어와서 개행을 제외한 문자열을 반환한다. BufferedReader를 사용할 때는 split 또는 StringTokenizer를 사용하여 입력받은 것을 쪼개고, 필요에 따라 int형 등으로 형변환해서 사용한다.
Java 입출력, Scanner와 BufferedReader의 비교
https://codingnotes.tistory.com/216 Java 입출력 (스트림, 버퍼) 스트림(Stream)이란? 먼저, 스트림 이란? 연속적인 데이터의 흐름 또는 데이터를 전송하는 소프트웨어 모듈을 의미합니다. 아래 그림처럼, 자
codingnotes.tistory.com
(4) 자바 BufferedReader 와 Scanner
Scanner 란? : Scanner 란 사용자에게 입력 장치로 입력을 받아 그 값을 변수에 저장하는 역할을 한다. ...
blog.naver.com
💡 StringTokenizer, StringBuilder, BufferedWriter
StringTokenizer:
- 장점:
- 문자열을 특정 구분자(delimiter)를 기준으로 쪼개어 처리할 수 있다. 이는 문자열을 빠르게 특정 패턴에 따라 분할할 수 있다는 것을 의미한다.
- 기본 자료형인 int, double 등의 형태로 쉽게 변환할 수 있다.
- 단점:
- 구분자를 기준으로 문자열을 분리하므로, 정확한 구분자를 지정해주어야 한다.
- 불필요한 메모리 사용이 발생할 수 있다. (예: Integer.parseInt() 메서드를 사용하여 문자열을 int로 변환하는 과정에서)
StringBuilder:
- 장점:
- 문자열을 수정할 때 매번 새로운 객체를 생성하지 않고 기존의 문자열에 수정을 가할 수 있다. 이는 메모리와 성능 면에서 이점을 가져온다.
- 문자열 결합 연산(+)을 반복적으로 수행할 때 효율적이다
- 단점:
- 여러 스레드에서 동시에 StringBuilder를 수정하려고 하면 예기치 않은 결과가 발생할 수 있다.
BufferedWriter.write():
- 출력할 때마다 바로 출력이 되는 것이 아니라, 내부의 버퍼에 쌓인 뒤에 한 번에 출력된다. 이는 출력 성능을 향상시키는 데 도움이 된다. write() 메서드는 문자열 외에도 문자(char), char 배열, 문자열의 일부분, 줄 바꿈 등을 출력할 수 있으며, flush() 메서드를 호출하여 버퍼를 비워주어야 실제 출력이 이루어진다.
✅ 풀이 코드 : StringTokenizer + BufferedWriter
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
StringTokenizer st; // 문자열 분리를 위해 StringTokenizer을 생성
for(int i = 0; i< T; i++) {
st = new StringTokenizer(br.readLine()," ");
// StringTokenizer을 생성해주면서 문자를 입력받는것을 반복
bw.write((Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken()))+"\n");
// StringTokenizer 토큰(=분리된 문자) 반환
// String 이므로 반환되므로 계산을 위해 정수형으로 형번환 (Integer.parseInt 사용)
// 형변환된 토큰 두 개를 더해준 값을 BufferedWriter.write() 에 담기
}
br.close(); // 자원 해제
bw.flush(); // 버퍼 비우기
bw.close(); // 자원 해제(버퍼 닫기)
}
}
✅ 풀이 코드 : StringTokenizer + StringBuilder
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()," ");
sb.append(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())).append('\n');
}
br.close();
System.out.println(sb);
}
}
'코딩테스트 > BaekJoon' 카테고리의 다른 글
[백준] 11022번 : A+B-8 자바 / java (1) | 2024.04.23 |
---|---|
[백준] 11021번 : A+B-7 자바 / java (1) | 2024.04.23 |
[백준] 25314번 코딩은 체육과목 입니다 - 자바 / java (0) | 2024.04.12 |
[백준] 25304번 영수증 - 자바 / java (0) | 2024.04.12 |
[백준] 8393번 합 - 자바 / java (0) | 2024.04.12 |