일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- IT
- 원티드
- 개발자취준
- 프로그래머스
- 알고리즘
- apm 소스설치
- 코테
- 코딩
- 백준 java
- Java
- 백엔드 개발자
- 코딩테스트
- 알고리즘풀이
- 백엔드
- 개발자
- 자바
- apm 수동설치
- IT취업
- 프리온보딩 백엔드 챌린지
- 백준
- IT취준
- 백준 자바
- 프리온보딩
- IT개발
- IT개발자
- 개발공부
- 백엔드개발자
- IT공부
- 기술면접
- cs지식
- Today
- Total
코이팅
[백준 JAVA] 15552번 : 빠른 A+B 본문
[Bronze IV] 빠른 A+B - 15552
성능 요약
메모리: 237300 KB, 시간: 912 ms
분류
구현(implementation), 사칙연산(arithmetic), 수학(math)
문제 설명
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.
Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.
또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.
이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.
입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
개념
🔵BufferedReader
- Buffer에 있는 IO 클래스이다.
- Scanner와 달리 BufferedReader는 개행문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다.
- BufferedReader는 동기화 되기 때문에 멀티 쓰레드 환경에서 안전하고, Scanner는 동기화가 되지 않기 때문에 멀티 쓰레드 환경에서 안전하지 않다.
- 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달된다.
- 시스템의 데이터 처리 효율성을 높여주며 버퍼스트림을 InputStreamReader / OutputStreamWriter를 같이 사용하여
버퍼링을 하면 입출력 스트림으로부터 미리 버퍼에 데이터를 갖다 놓기 때문에 보다 효율적인 입출력이 가능하다.
※ BufferedReader 클래스의 메인 함수들
Modifier and Type | Method and Description |
void | close() 입력 스트림을 닫고, 사용하던 자원을 해제 |
void | mark(int , readAheadLimit) 스트림의 현재 위치를 마킹 |
int | read() 한 글자만 읽어 정수형으로 반환 (e.g ,'3'을 읽어 정수형인 (int)'3' = 51로 반환) |
String | readLine() 한 줄을 읽음 |
boolean | ready() 입력 스트림이 사용할 준비가 되었는지 확인 (1이 준비 완료) |
🔵 BufferedWriter
- Buffer에 있는 IO 클래스이다.
- 출력도 버퍼를 거쳐서 간접적으로 출력장치로전달된다.
- 많은 양의 출력을 할 때는, 입력과 동일하게 버퍼를 사용하는 것이 좋다.
- BufferedWriter는 System.out.println(""); 처럼 출력과 개행을 동시해 해주지 않는다.
- 개행을 위해선 따로 newLine(); 혹은 bw.write("\n");을 사용해야한다.
- BufferedWriter의 경우 버퍼를 잡아 놓았기 때문에 반드시 사용한 후에, flush()/ close()를 해주어야 한다.
- close()를 하게되면, 출력 스트림을 아예 닫아버리기 때문에 한번 출력후, 다른 것도 출력하고자 한다면 flush()를 사용하면 된다.
- 시스템의 데이터 처리 효율성을 높여주며 버퍼스트림을 InputStreamReader / OutputStreamWriter를 같이 사용하여
버퍼링을 하면 입출력 스트림으로부터 미리 버퍼에 데이터를 갖다 놓기 때문에 보다 효율적인 입출력이 가능하다.
※ BuffereWriter 클래스의 메인 함수들
Modifier and Type | Method and Description |
void | close() 스트림을 닫음. 닫기 전 flush(). |
void | flush() 스트림을 비움 |
void | newLine() 개행 문자 역할 |
void | write(char[] buf, int offset, int length ) 버퍼 offset 위치부터 length 크기 만큼 write |
void | write(int c) 한 글자 쓰기 |
void | write(String s, int offset, int length) 문자열에서 offset에서부터 일정 길이만큼 write |
🔵 StringTokenizer
- StringTokenizer 클래스를 사용해서 응용 프로그램에서 문자열을 토큰 단위로 구분해서 만들어주는 클래스이다.
- StringTokenizer 클래스에서 메소드는 식별자, 숫자 및 인용문자열을 구분하지 않는다.
- 심지어 주석을 인식해서 건너뛰지도 않는다.
- StringTokenizer()를 통해서 문자열을 파싱하게 되면 일반적인 split() 메소드를 사용하는 것 보다 훨씬 간편하게 파싱이 가능하다. =>*split() 메소드를 쓰면 for문을 순회하는 로직이 추가되어야 하고, 불필요한 로직이 될 수 있다.
※ StringTokenizer 클래스의 메인 함수들
Modifier and Type | Method and Description |
int | countTokens() 꺼내지 않고 남아 있는 토큰의 수 |
boolean | hasMoreTokens() 남아 있는 토큰이 있는지 여부 |
String | nextToken() 토큰을 하나씩 꺼내옴 |
import java.io.IOException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
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;
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine(), " ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
bw.write(A + B + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
'백준 알고리즘 > Bronze' 카테고리의 다른 글
[백준 JAVA] 11022번 : A+B - 8 (0) | 2022.11.23 |
---|---|
[백준 JAVA] 11021번 : A+B - 7 (0) | 2022.11.23 |
[백준 JAVA] 25304번 : 영수증 (0) | 2022.11.22 |
[백준 JAVA] 8393번 : 합 (0) | 2022.11.22 |
[백준 JAVA] 10950번 : A+B - 3 (0) | 2022.11.19 |