[백준] 10952번 : A+B - 5 -JAVA [자바]
https://www.acmicpc.net/problem/1001
- 문제
매우 간단한 문제다!
※ 주의할 점
- 두 정수는 공백으로 구분되어 주어진다.
- 테스트를 종료하는 기점은 0 두 개를 입력받은 시점이다.
- 3가지 풀이 방법을 제시한다
먼저 입력 방법을 달리하여 풀이하는 2가지, 마지막으로 시간을 더욱 단축시킬 수 있는 방법을 알아보고자 한다.
아래 이전에 풀이방법을 참고해보아도 좋을 것 같다.
https://st-lab.tistory.com/33?category=830885
- 풀이
- 방법 1
import java.util.Scanner;
public class Main {
public static void main(String args[]){
Scanner in=new Scanner(System.in);
while(true){
int A=in.nextInt();
int B=in.nextInt();
if(A==0 && B==0){
in.close();
break;
}
System.out.println(A+B);
}
}
}
가장 기초적인 방법이다.
while ( true ) 로 무한 반복 하면서 만약 A 와 B 가 둘 다 0 일경우 break; 를 통해 반복문을 종료해주고, 아닐경우 입력받은 A 와 B 를 더해준다.
- 방법 2
Scanner 를 쓰면 시간이 너무 많이 걸린다. 그렇기 때문에 다른 입력 방식인 BufferedReader 을 쓸 것이다.
BufferedReader.readLine() 을 통해 입력 받게 되는데, 이는 문자열 한 줄을 한 번에 입력받기 때문에 공백까지 입력되어버린다. 그렇기 때문에 공백을 기준으로 문자열을 분리해주어야 한다.
두 가지 방법이 있는데 String.split() 을 통해 분리해주는 방법, StringTokenizer 로 분리되어 저장하면서 꺼내오는 방법이 있다.
다만 필자는 StringTokenizer 을 쓰겠다.
그리고 StringTokenizer 을 통해 문자열 분리한 뒤 꺼내오는 메소드, st.nextToken() 은 문자열을 반환하니 Integer.parseInt()로 int 형으로 변환시켜주어야 한다.
또한 StringBuilder 을 사용 할 것이다.
그럼 아래 코드를 보자.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
while(true) {
st = new StringTokenizer(br.readLine()," ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
if(A==0 && B==0) {
break;
}
sb.append((A+B)).append('\n');
}
System.out.println(sb);
}
}
위와 같이 입력받아서 사용하는 방법도 있다.
또 다른 방법으로는 입력방법이 한 자리 수이니 공백의 위치는 고정이라는 점을 이용하여 풀 수도 있다.
또한 StringTokenizer 을 계속 생성해줄 필요 없으니 성능 측면에서 좀 더 이점을 보일 것이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while(true) {
String str = br.readLine();
int A = str.charAt(0) - 48;
int B = str.charAt(2) - 48;
if(A==0 && B==0) {
break;
}
sb.append((A+B)).append('\n');
}
System.out.println(sb);
}
}
전에 위와 비슷한 포스팅에서도 언급했지만 charAt() 의 경우 문자로 반환되기 때문에 반드시 -48 (또는 -'0') 을 해주어야 우리가 아는 정수의 형태가 나온다.
- 성능 차이
위에서 부터 순서대로
채점 번호 : 17877741 - BufferedReader + String.charAt()
채점 번호 : 17877730 - BufferedReader + StringTokenizer()
채점 번호 : 17877723 - Scanner
위 이미지와 같이 먼저 입력방법에서 시간차이가 많이 난다는점과 단순 문자열일 때 charAt을 통해 분리해주는 방법이 더 빠를 수 있음을 알 수 있다.
또한 필자가 마지막으로 제시한 코드를 잘만 수정하면 Java 제출자 중 상위권에 랭크될 수 있을 것이다.
- 정리
이 문제는 for문 카테고리에서도 A+B - 7 과 문제가 유사하다.
그래서 푸는데 별로 어렵지 않았으리라 본다.
필자가 제시하는 코드들 모두 한 번씩 시도해보고 어느 상황에서 어느 알고리즘이 더욱 좋은지 테스트해보다보면 분명 여러분 또한 실력이 향상될 수 있을 것이다.
'JAVA - 백준 [BAEK JOON] > 반복문' 카테고리의 다른 글
[백준] 1110번 : 더하기 사이클 - JAVA [자바] (36) | 2020.02.26 |
---|---|
[백준] 10951번 : A+B - 4 - JAVA [자바] (61) | 2020.02.24 |
[백준] 2439번 : 별 찍기 - 2 - JAVA [자바] (6) | 2020.02.19 |
[백준] 2438번 : 별찍기 - 1 - JAVA [자바] (8) | 2020.02.19 |
[백준] 11022번 : A+B - 8 - JAVA [자바] (10) | 2020.02.19 |