Programming/알고리즘

[백준] 10951 - A+B-4 - JAVA[자바]

Gilbert_ 2022. 11. 26. 18:47

이 문제에서 주의할 점은

파일 종료 조건이 없이 입력이 주어진다는 것이다.

 입력에서 더이상의 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하라는 것이다.

 

데이터가 더이상 존재하지 않을 때 우리는 EOF (End of File) 즉, 파일의 끝이라 한다

 

BufferedReader를 쓰면, readLine()을 통해 입력받아 연산하는데,

readLine() != null 일때까지만 while문을 돌려주면 되겠다.

 

주의 할점!

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;


public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        while (br.readLine() != null){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");   
            int a = Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken());
            sb.append(a);
            sb.append("\n");
        }
        System.out.print(sb);
    }
}

이렇게, 바로 br.readLine()을 쓰면 안되고,

String str; 을 선언해 준 뒤에 받아서 써야한다. 

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;


public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String str;
        
        while ((str=br.readLine()) != null){
            StringTokenizer st = new StringTokenizer(str, " ");   
            int a = Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken());
            sb.append(a);
            sb.append("\n");
        }
        System.out.print(sb);
    }
}

그 이유는 br.readLine()이 호출 될 때마다 줄이 바뀌기 때문이다.

같은 객체를 지칭하는 것은 아니다. 즉, 다른 객체를 호출하고, 나중엔 결국 마지막 줄 다음에 nullpointerException을 발생시킨다.

 

 

 

- 추가

StringTokenizer가 객체를 생성하는게 못마땅한 경우?

=> 한 자리수 정수만 입력받는다 == 공백(" ")의 위치도 항상 고정되어 있다.

 

=========================객체 생성을 하지 않고 쉽고 빠르게 짜보자 =========================

=========================객체 생성을 하지 않고 쉽고 빠르게 짜보자 =========================

=========================객체 생성을 하지 않고 쉽고 빠르게 짜보자 =========================

 

- charAt() 사용하기.

 

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;


public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        while (br.readLine() != null){
            int a = str.charAt(0) - 48;
            int b = str.charAt(2) - 48;
            sb.append(a+b);
            sb.append("\n");
        }
        System.out.print(sb);
    }
}

 

charAt()은 해당 문자의 아스키코드 값을 반환하기 때문에
우리가 원하는 "숫자"를 사용하고 싶다면

반드시 -48 또는 -0을 해주어야 한다. 

 

성능면에서는 크게 차이가 나지 않는다.

위의 것이 BufferedReader + String.charAt(),

아래 것이 BufferedReader + StringTokenizer 이다.