[백준] 10951 - A+B-4 - JAVA[자바]
이 문제에서 주의할 점은
파일 종료 조건이 없이 입력이 주어진다는 것이다.
즉 입력에서 더이상의 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하라는 것이다.
데이터가 더이상 존재하지 않을 때 우리는 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 이다.