코이팅

[백준 JAVA] 15552번 : 빠른 A+B 본문

백준 알고리즘/Bronze

[백준 JAVA] 15552번 : 빠른 A+B

코이팅 2022. 11. 22. 11:45
728x90
반응형

[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();
    }
}

 

728x90
반응형

'백준 알고리즘 > 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
Comments