1. 2739번_구구단
▶ 문제
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오, 출력 형식에 맞춰서 출력하면 된다.
▶ 입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.
▶ 출력
출력형식과 같게 N*1부터 N*9까지 출력한다.
▶ 예제입력1
2
▶ 예제출력1
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
▶ 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
for(int i = 1; i <= 9; i++) {
System.out.println(num + " * " + i + " = " + num * i);
}
}
}
사용자로부터 입력받기 위해 Scanner 객체 사용.
num 변수를 사용해서 구구단의 단을 입력.
반복분 사용하여 구구단 출력.
여기에서 주의할 점은 출력할 때 공백을 출력한다는 것.
2. 10950번_A+B-3
▶ 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램 작성하시오.
▶ 입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
▶ 출력
각 테스트 케이스마다 A+B를 출력한다.
▶ 예제입력1
5
1 1
2 3
3 4
9 8
5 2
▶ 예제출력1
2
5
7
17
7
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int array[] = new int[num];
for(int i = 0; i < num; i++) {
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
array[i] = num1 + num2;
}
/*for(int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}*/
for (int i : array) {
System.out.println(i);
}
}
}
▶ 풀이02_BufferedReader + StringTokenizer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main02 {
public static void main(String[] args) throws IOException {
// 사용자에게 입력받을 도구 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 사용자에게 입력받은 횟수에 대한 변수 생성
int num = Integer.parseInt(br.readLine());
// 문자열 저장 객체
StringBuilder sb = new StringBuilder();
// 반복문 돌면서 입력받은 숫자들 저장
for(int i = 0; i < num; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
sb.append(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()));
sb.append('\n');
}
System.out.println(sb);
}
}
Scanner 객체를 사용하는 것보다 BufferedReader을 사용하면 속도가 빨라짐.
첫 번째는 풀이02인 BufferedReader, StringTokenizer을 사용한 것이고, 두 번째는 풀이01인 Scanner 사용한 것임.
코드의 길이가 더 길어도 확실히 빠른 것을 알 수 있음.
● BufferedReader br = new BufferedReader(new InputStreaReader(System.in));
System.in → 키보드 등으로 사용자에게 입력을 받음.
InputStreamReader → char 단위로 받음.
BufferedReader → Buffer 단위로 전송할 것.
● StringTokenizer st = new StringTokenizer(br.readLine());
StringTokenizer는 지정된 구분자(-, 공백 등)로 token을 나누어주는 클래스로 보면 됨.
br.readLine()은 읽어 들인 한 줄을 StringTokenizer로 구분자 분리할 준비를 하는 것.
구분자가 없으면 공백이 구분자임.
● 코드 풀이 ●
BufferedReader br = new BufferedReader(new InputStreaReader(System.in));
- 키보드 입력을 빠르게 받기 위해 BufferedReader 객체 생성.
- System.in을 감싸서 문자 기반 입력 스트림으로 바꿈.
int num = Integer.parseInt( br.readLine());
- 사용자에게 입력받을 횟수에 대한 변수 생성.
- Integer.parseInt를 사용하는 이유는 br.readLine();만 쓰면 문자열을 의미하므로 정수로 변환해주기 위해 사용.
- 즉 사용자에게 문자열을 입력받아 정수로 변환하여 변환된 정수를 변수에 저장하는 것.
for(int i = 0; i < num; i++) {
st = new StringTokenizer(br.readLine());
sb.append(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()));
sb.append('\n');
}
- st = new StringTokenizer(br.readLine());을 통해 한 줄씩 입력받음. 예를 들어 5 7을 입력하면 "5", "7"로 나눠줌.
- st.nextToken()으로 첫 번째 숫자 가져옴. 예를들어 5.
- st.nextToken()으로 두 번째 숫자 가져옴. 예를들어 7.
- Integer.parseInt를 통해 정수로 변환하여 두 숫자를 더해서 sb에 붙이고, 줄 바꿈 문자(\n)도 붙여서 출력 준비.
System.out.println(sb);
- sb에 모아둔 결과를 한 번에 출력.
● append 연산자 ●
자바에서 문자열을 이어 붙일 때 사용하는 메서드.
특히 StringBuilder, StringBuffer 사용할 때 자주 등장.
연산자(+)를 사용하는 것보다 append 메서드를 사용하는 게 좋은 이유는 + 연산자를 사용할 때마다 새로운 문자열 객체를 계속 생성하면 반복이 많아져서 성능이 나빠짐.
따라서 StringBuilder + append() 사용하면 StringBuilder 내부에서 문자열을 하나의 공간에 계속 덧붙이는 방식이기 때문에 훨씬 빠르고 효율적이게 됨.
● StringBuilder 객체 ●
문자열을 효율적으로 이어 붙일 수 있게 해주는 클래스.
문자열을 하나의 공간에 계속 수정, 추가할 수 있으며 성능이 훨씬 좋음. (반복문 안에서 문자열 작업할 때)
3. 8393_합
▶ 문제
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
▶ 입력
첫째 줄에 n (1 <= n <= 10,000)이 주어진다.
▶ 출력
1부터 n까지 합을 출력한다.
▶ 예제입력1
3
▶ 예제출력1
6
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.close();
int sum = 0;
for(int i = 1; i <= num; i++) {
sum += i;
}
System.out.println(sum);
}
}
▶ 풀이02_BufferedReader
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
int sum = (num * (num + 1)) / 2;
System.out.println(sum);
/*
int num = Integer.parseInt(br.readLine());
int sum = 0;
for(int i = 1; i <= num; i++) {
sum += i;
}
System.out.println(sum);
*/
}
}
첫 번째는 풀이 01, 두 번째는 풀이02.
for문을 사용해서 풀어도 되고, 수학 공식인 (num * (num + 1)) / 2로 풀어도 됨.
4. 25034_영수증
▶ 문제
준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다!
준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.
영수증에 적힌,
- 구매한 각 물건의 가격과 개수
- 구매한 물건들의 총금액
을 보고, 구매한 물건의 가격과 개수로 계산한 총금액이 영수증에 적힌 총금액과 일치하는지 검사해 보자.
▶ 입력
구매한 물건의 가격과 개수로 계산한 총금액이 영수증에 적힌 총금액과 일치하면 Yes를 출력한다. 일치하지 않으면 No를 출력한다.
▶ 제한
- 1 <= X <= 1,000,000,000
- 1 <= N <= 100
- 1 <= a <= 1,000,000
- 1 <= b <= 10
▶ 예제입력1
2600000
4
20000 5
30000 2
10000 6
5000 8
▶ 예제출력1
Yes
▶ 예제입력2
250000
4
20000 5
30000 2
10000 6
5000 8
▶ 예제출력2
No
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int totalPrice = scanner.nextInt();
int totalQuantity = scanner.nextInt();
int total = 0;
for(int i = 0; i < totalQuantity; i++) {
int price = scanner.nextInt();
int quantity = scanner.nextInt();
total += (price * quantity);
}
if(totalPrice - total == 0) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
▶ 풀이02_BufferedReader + StringTokenizer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int totalPrice = Integer.parseInt(br.readLine());
int totalQuantity = Integer.parseInt(br.readLine());
int total = 0;
for(int i = 0; i < totalQuantity; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
total += ((Integer.parseInt(st.nextToken()) * Integer.parseInt(st.nextToken())));
}
if (totalPrice == total) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
첫 번째는 풀이01, 두 번째는 풀이02
▶ 풀이02-2_BufferedReader + StringTokenizer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int totalPrice = Integer.parseInt(br.readLine());
int totalQuantity = Integer.parseInt(br.readLine());
int total = 0;
for(int i = 0; i < totalQuantity; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int price = Integer.parseInt(st.nextToken());
int quantity = Integer.parseInt(st.nextToken());
total += (price * quantity);
}
if (total == totalPrice) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
▶ 풀이02-3_BufferedReader + StringTokenizer + 배열사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int totalPrice = Integer.parseInt(br.readLine());
int totalQuantity = Integer.parseInt(br.readLine());
int total = 0;
for(int i = 0; i < totalQuantity; i++) {
String[] str = br.readLine().split(" ");
int price = Integer.parseInt(str[0]);
int quantity = Integer.parseInt(str[1]);
total += (price * quantity);
}
if(total == totalPrice) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
5. 25314_코딩은 체육과목입니다
▶ 문제
오늘은 혜아의 면접날이다. 면접 준비를 열심히 해서 앞선 질문들을 잘 대답한 혜아는 이제 마지막으로 칠판에 직접 코딩하는 문제를 받았다.
혜아가 받은 문제는 두 수를 더하는 문제였다. C++ 책을 열심히 읽었던 혜아는 간단히 두 수를 더하는 코드를 칠판에 적었다.
코드를 본 면접관은 다음 질문을 했다. "만약, 입출력이 N바이트 크기의 정수라면 프로그램을 어떻게 구현해야 할까요?"
혜아는 책에 있는 정수 자료형과 관련된 내용을 기억해 냈다.책에는 long int는 4바이트 정수까지 저장할 수 있는 정수 자료형이고, long long int는 8바이트 정수까지 저장할 수 있는 정수 자료형이라고 적혀 있었다. 혜아는 이런 생각이 들었다. "int 앞에 long을 하나씩 더 붙일 때마다 4바이트씩 저장할 수 있는 공간이 늘어나는걸까? 분명 long long long int는 12바이트, long long long long long int는 16바이트까지 저장할 수 있는 정수 자료형일거야!" 그렇게 혜아는 당황하는 면접관의 얼굴을 뒤로한 채 칠판에 정수 자료형을 써 내려가기 시작했다.
혜아가 N바이트 정수까지 저장할 수 있다고 생각해서 칠판에 쓴 정수 자료형의 이름은 무엇일까?
▶입력
첫 번째 줄에는 문제의 정수 N이 주어진다. (4 <= N <= 1000; N은 4의 배수)
▶ 출력
혜아가 N바이트 정수까지 저장할 수 있다고 생각하는 정수 자료형의 이름을 출력하여라.
▶ 예제입력1
4
▶ 예제출력1
long int
▶ 예제입력2
20
▶ 예제출력2
long long long long long int
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.close();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < num/4; i++) {
sb.append("long ");
}
sb.append("int");
System.out.println(sb);
}
}
▶ 풀이02_BufferedReader → 메모리와 시간이 가장 짧았음.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
final int BYTES_PER_LONG = 4;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
int repeat = num / BYTES_PER_LONG;
StringBuilder sb = new StringBuilder();
for(int i = 0; i < repeat; i++) {
sb.append("long ");
}
sb.append("int");
System.out.println(sb);
}
}
final int BYTES_PER_LONG = 4;
int repeat = num / BYTES_PER_LONG;
- 4라는 숫자(4가 반복 기준)에 의미 부여하기 위해 final(변하지 않음) 키워드 사용하여 상수로 선언.
- repeat은 해당 숫자만큼 "long "을 출력하기 위해 사용된 반복 횟수.
6. 15552_빠른 A+B
▶ 문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
C++을 사용하고 있고 cin / cout을 사용하고자 한다면, cint.tie(NULL)과 sync_with_studio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf / printf / puts / getchar / putchar 등 C의 입출력 방식을 사용하면 안 된다.
JAVA를 사용하고 있다면 Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
Python을 사용하고 있다면 input 대신 sys.stdin.readlind을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해주는 것이 좋다.
또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다.
테스트 케이스를 하나 받은 뒤 하나 출력해도 된다. 자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.
이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.
▶ 입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T 줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1000 이하이다.
▶ 출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
▶ 예제입력1
5
1 1
12 34
5 500
40 60
1000 1000
▶ 예제출력1
2
46
505
100
2000
▶ 풀이
import java.io.*;
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 num = Integer.parseInt(br.readLine());
for(int i = 0; i < num; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())) + "\n");
}
bw.flush();
bw.close();
}
}
7. 11021_A+B-7
▶ 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
▶ 입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
▶ 출력
각 테스트 케이스마다 "Case #x "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.
▶ 예제입력1
5
1 1
2 3
3 4
9 8
5 2
▶예제출력1
Case #1: 2
Case #2: 5
Case #3: 7
Case #4: 17
Case #5: 7
▶ 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
StringTokenizer st;
for(int i = 0; i < num; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
sb.append("Case #").append(i+1).append(": ").append(a+b).append("\n");
}
System.out.println(sb);
}
}
8. 11022_A+B - 8
▶ 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
▶ 입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
▶ 출력
각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.
▶ 예제입력1
5
1 1
2 3
3 4
9 8
5 2
▶ 예제출력1
Case #1: 1 + 1 = 2
Case #2: 2 + 3 = 5
Case #3: 3 + 4 = 7
Case #4: 9 + 8 = 17
Case #5: 5 + 2 = 7
▶ 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
StringTokenizer st;
for(int i = 0; i < num; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
sb.append("Case #").append(i+1).append(": ").append(a).append(" + ").append(b).append(" = ").append(a+b).append("\n");
}
System.out.println(sb);
/*
String str = sb.toString();
System.out.println(str);
br.close();
*/
}
}
toString() 메서드 사용
StringBuilder는 문자열을 효율적으로 조립할 수 있도록 도와주는 클래스.
문자열을 계속 이어 붙일 때 새로운 객체를 만들지 않고 내부 버퍼에 저장해 둠.
하지만 System.out.println() 같은 출력 메서드는 String 객체를 기대함. 그래서 우리가 만든 StringBuilder를 실제 문자열로 바꾸려면 toString()을 호출해야 함.
sb는 StringBuilder 타입이라 바로 문자열처럼 쓸 수 없음.
따라서 String 타입으로 변수 선언하려면 .toString() 메서드 사용해야 함.
물론 System.out.println(sb);도 내부적으로 toString()을 호출하기 하지만, 명시적으로 toString()을 사용하면 더 명확한 의도 표현 가능.
그리고 문자열을 따로 저장하거나 리턴해야 할 때 반드시 toString()이 필요함.
9. 2438_별 찍기 - 1
▶ 문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
▶ 입력
첫째 줄에 N(1<=N<=100)이 주어진다.
▶ 출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
▶ 예제입력1
5
▶ 예제출력1
*
**
***
****
*****
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
for(int i = 0; i < num; i++) {
for(int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
▶ 풀이02_BufferedReader
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i = 0; i < num; i++) {
for(int j = 0; j <= i; j++) {
sb.append("*");
}
sb.append("\n");
}
String str = sb.toString();
System.out.println(str);
br.close();
}
}
첫 번째는 풀이01, 두 번째는 풀이02
10. 2439_별 찍기 - 2
▶ 문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제.
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
▶ 입력
첫째 줄에 N(1<= N <= 100)이 주어진다.
▶ 출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
▶ 예제입력1
5
▶ 예제출력1
*
**
***
****
*****
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
for(int i = 0; i < num; i++) {
for(int j = 0; j < num - i - 1; j++) {
System.out.print(" ");
}
for(int k = 0; k <= i; k++) {
System.out.print("*");
}
System.out.println();
}
}
}
▶ 풀이02_BufferedReader
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i = 0; i < num; i++) {
for(int j = 0; j < num - i -1; j++) {
sb.append(" ");
}
for(int k = 0; k <= i; k++) {
sb.append("*");
}
sb.append("\n");
}
String star = sb.toString();
System.out.println(star);
br.close();
}
}
첫 번째는 풀이02, 두 번째는 풀이01
11. 10952_A+B - 5
▶ 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
▶ 입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에는 A와 B가 주어진다. (0 < A, B < 10)
입력의 마지막에는 0 두 개가 들어온다.
▶ 출력
각 테스트 케이스마다 A+B를 출력한다.
▶ 예제입력1
1 1
2 3
3 4
9 8
5 2
0 0
▶ 예제출력1
2
5
7
17
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
if(num1 == 0 && num2 == 0) {
break;
}
System.out.println(num1 + num2);
}
}
}
▶ 풀이02_BufferedReader, StringTokenizer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
if(num1 == 0 && num2 == 0) {
break;
}
sb.append(num1 + num2).append("\n);
}
System.out.println(sb);
br.close();
}
}
12. 10951_A+B - 4
▶ 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
▶ 입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
▶ 출력
각 테스트 케이스마다 A+B를 출력한다.
▶ 예제입력1
1 1
2 3
3 4
9 8
5 2
▶ 예제출력1
2
5
7
17
7
▶ 풀이01_Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num1 + num2);
}
}
}
▶ 풀이02_BufferedReader, StringTokenizer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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();
String str;
while((str = br.readLine()) != null) {
st = new StringTokenizer(str);
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
sb.append(num1 + num2).append("\n");
}
System.out.println(sb);
br.close();
}
}
백준에서 풀이를 제출하면 정답으로 처리되지만, 실제로 프로그램을 실행하면 NoSuchElementException을 던지게 됨.
이 문제는 EoF(End of File)의 개념이 적용되어 있는데, EoF는 아래 설명과 같음.
EoF는 입력에서 더 이상 읽을 수 있는 데이터가 없을 때 우리는 EoF라고 하는데, 파일의 끝이라는 뜻임.
읽을 수 있는 데이터가 없다는 뜻은 입력을 하지 않았다는 뜻과 같으므로 null을 뜻함.
실제로 프로그램을 실행하고 싶으면 Ctrl + D를 해주어 InputMismatchException을 던져주어야 함.
'알고리즘 > 백준' 카테고리의 다른 글
[백준 알고리즘]_1차원 배열 (0) | 2025.05.01 |
---|---|
[백준 알고리즘]_조건문 (0) | 2024.08.14 |
[백준 알고리즘]_입출력과 사칙연산 (1) | 2024.08.13 |