TIL

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

온풀 2022. 3. 31. 23:52

10950 A+B - 3

import java.util.Scanner;

public class Main 
{
    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();

        while (num > 0) 
        {
            int a = sc.nextInt();
            int b = sc.nextInt();

            System.out.println(a + b);

            num--;
        }
    }
}

10950 A+B 문제는 간단하다. 계속 써오던 Scanner로 정수를 입력받아 개수를 지정하고 개수만큼 while 문을 돌려 a + b 연산이 이루어지도록 했다. 문제 예제를 보면 각 케이스의 개수 T를 입력 후 엔터를 입력한 후에 정수 두 개는 공백으로 구분하여 입력받는 건데, Scanner에서의 엔터가 어떻게 적용되는지 헷갈렸다. 실행 시 엔터, 공백을 연달아 써도 문제 없이 입력되는 것을 확인할 수 있었다.
자바 도큐먼트 확인 결과 스캐너는 기본적으로 공백과 일치하는 구분자 패턴을 사용하여 입력을 토큰으로 나눈다고 써있다. 여기서 말하는 '공백과 일치하는 구분자 패턴'은 엔터와 공백 모두 상관없는 건가? 궁금하다.

15552 빠른 A+B

10950과 같은 방법으로 풀려고 했으나 입출력 방식의 속도 때문에 BufferedReader 사용을 권장했다. 사실 아직 BufferedReader로 입력 받을 때 공백 구분을 적용하는 것이 익숙치 않아서 10950의 Scanner와 nextInt()도 다시 한번 고민해 보게 된 것이다.

나는 이 문제를 풀기 위해 BufferedWriter로 버퍼에 담아두었다가 한 번에 데이터를 출력하는 방법을 사용했다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main 
{
    public static void main(String[] args) throws NumberFormatException, IOException 
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int num = Integer.parseInt(br.readLine());

        StringTokenizer st;

        while (num > 0) 
        {
            st = new StringTokenizer(br.readLine()," ");

            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            bw.write(a + b + "\n");

            num--;
        }

        bw.flush();
        bw.close();
    }
}

일단 이렇게 풀어서 맞았으나... 아직 StringTokenizer이랑 BufferedWriter은 익숙하지 않다.

Q1. Scanner, nextInt() 사용 시 엔터로 구분, 공백으로 구분 이 순서로 연달아 사용해도 문제 없이 입력되었다. 그 근거를 찾고 싶다.
Q2. 단순 문제 풀이를 할 때, 이렇게 궁금한 게 생기면 어느정도의 수준까지 이해를 해야 할까? 지금 내가 백준을 푸는 이유는 자바 문법의 이해를 위한 거니까 시간을 들이더라도 완벽히 이해하는 게 낫겠지?

++ StringTokenizer, nextToken(), BufferedWriter 사용법 숙지하기