
내가 생각했을때 문제에서 원하는부분
The input consists of N cases. The first input line contains only the integer N, and we assume that N > 0.
The follow the cases.
Each case consists of exactly one line with two non-negative integers separated by a space.
These are the reversed numbers you are to add.
We assume that all numbers are in the range 0 ≤ n < 10^9.
For each case, print exactly one line containing only one integer—the backward sum of the two backward numbers.
Omit any leading zeroes in the output.
내가 이 문제를 보고 생각해본 부분
BufferedReader 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
표준 입력을 빠르게 읽기 위한 객체를 만든다.
Scanner보다 속도가 빠르고, 한 줄 단위로 읽기 편하다.
이후 readLine()으로 한 줄씩 입력을 읽는다.
테스트 케이스 수 읽기
int T = Integer.parseInt(br.readLine().trim());
첫 줄을 읽어 trim()으로 양쪽 공백을 제거한 뒤 정수로 파싱한다.
만약 빈 줄이나 잘못된 형식이 들어오면 예외가 발생할 수 있지만, 문제 조건에서는 첫 줄에 케이스 수가 정확히 주어진다고 가정한다.
출력 누적을 위한 StringBuilder 준비
StringBuilder sb = new StringBuilder();
각 케이스 결과를 하나씩 출력하는 대신 StringBuilder에 이어붙인 뒤 한 번에 출력하면 IO 비용을 줄일 수 있어 성능상 이점이 있다.
각 테스트 케이스 반복 처리
for (int t = 0; t < T; t++) { ... }
T회 반복하면서 각 줄(한 케이스)을 처리한다.
한 줄 읽기 및 공백 분리
String line = br.readLine();
String[] parts = line.trim().split("\s+");
한 줄을 읽고 trim()으로 앞뒤 공백을 제거한 뒤, 정규식 "\s+"로 공백(연속된 공백 포함)을 기준으로 분리해 두 숫자 문자열을 얻는다.
이렇게 하면 "24 1"처럼 공백이 여러 개 있어도 안전한다.
뒤집힌 문자열을 원래 순서로 복원(그리고 앞쪽 0 제거)
String a = new StringBuilder(parts[0]).reverse().toString().replaceFirst("^0+", "");
String b = new StringBuilder(parts[1]).reverse().toString().replaceFirst("^0+", "");
parts[0]과 parts[1]은 문제에서 주어진 '뒤집힌 숫자'이다.
StringBuilder로 reverse()를 통해 뒤집으면 원래 숫자 형태가 된다.
예: "305" → reverse() → "503".
reverse()한 문자열은 원래 숫자의 앞쪽(즉 이 자리에서는 leading zero)이 있을 수 있으므로, replaceFirst("^0+", "")로 문자열 맨 앞의 연속된 '0'을 제거한다.
정규식 "^0+"는 문자열 시작(^)부터 하나 이상(+)의 '0'을 뜻한다.
만약 모두 0이라서 빈 문자열이 되면 다음 단계에서 "0"으로 보정한다.
빈 문자열 보정(모두 0인 경우 처리)
if (a.isEmpty()) a = "0";
if (b.isEmpty()) b = "0";
예: 입력이 "0" 혹은 "00" 같은 경우 reverse 후 replaceFirst로 빈 문자열이 될 수 있으므로 "0"으로 바꿔 안전하게 숫자로 파싱한다.
숫자 변환 및 덧셈
long ai = Long.parseLong(a);
long bi = Long.parseLong(b);
long sum = ai + bi;
문자열을 정수로 변환해 더한다.
문제 제약상 각 수는 0 ≤ n < 1e9이므로 int 범위에 들어가지만, 안전성을 위해 long을 사용한 것이다.
합 역시 int 범위를 약간 넘을 가능성은 거의 없지만 long을 쓰면 안전한다.
합을 뒤집어서 출력 형태로 변환(그리고 앞쪽 0 제거)
String revSum = new StringBuilder(String.valueOf(sum)).reverse().toString().replaceFirst("^0+", "");
if (revSum.isEmpty()) revSum = "0";
합(sum)을 문자열로 바꾼 뒤 reverse()로 뒤집어 문제에서 요구하는 '뒤집힌 합' 형태로 만든다.
뒤집은 결과에는 앞(역순에서의 leading zero)이 있을 수 있으니 다시 replaceFirst("^0+", "")로 제거한다.
예: 합이 1000이면 "1000" → reverse → "0001" → 앞 0 제거 → "1".
빈 문자열이 나오면(합이 0인 경우 등) "0"으로 보정한다.
결과 누적
sb.append(revSum).append('\n');
각 케이스의 결과를 StringBuilder에 줄 단위로 붙인다.
누적된 결과 한 번에 출력
System.out.print(sb.toString());
반복이 끝나면 한 번에 출력합니다. 이 방식이 다수의 println을 호출하는 것보다 빠르다.
BufferedReader 닫기
br.close();
사용한 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_32;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 6721번 문제
public class Main1275 {
public static void main(String[] args) throws IOException {
// 입력을 빠르게 읽기 위한 BufferedReader를 생성한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 줄: 테스트 케이스 수 T를 읽어 정수로 변환
int T = Integer.parseInt(br.readLine().trim());
// 결과를 한 번에 출력하기 위한 StringBuilder
StringBuilder sb = new StringBuilder();
// 각 테스트 케이스 처리
for (int t = 0; t < T; t++) {
// 한 줄 전체를 읽는다 (예: "24 1")
String line = br.readLine();
// 공백으로 나누어 두 숫자 문자열을 얻는다
String[] parts = line.trim().split("\\s+");
// parts[0]과 parts[1]은 '뒤집힌' 숫자 문자열이다.
// StringBuilder로 리버스한 뒤, 리버스 결과의 앞쪽(원래의 꼬리)이 될 수 있는 0들(leading zeros)을 제거한다.
// replaceFirst("^0+", "")는 정규식으로 문자열 앞의 0들을 제거한다.
String a = new StringBuilder(parts[0]).reverse().toString().replaceFirst("^0+", "");
String b = new StringBuilder(parts[1]).reverse().toString().replaceFirst("^0+", "");
// 만약 모든 문자가 0이어서 빈 문자열이 되면 "0"으로 보정한다.
if (a.isEmpty()) a = "0";
if (b.isEmpty()) b = "0";
// 안전하게 숫자로 변환 (입력 범위가 작으므로 int로도 가능하지만 long을 사용하여 여유를 둠)
long ai = Long.parseLong(a);
long bi = Long.parseLong(b);
// 두 정수를 더한다
long sum = ai + bi;
// 합을 문자열로 만든 뒤 뒤집어서 '뒤집힌 합' 형태로 만든다.
// 그리고 다시 앞의 0들을 제거한다(예: "0001" -> "1").
String revSum = new StringBuilder(String.valueOf(sum)).reverse().toString().replaceFirst("^0+", "");
if (revSum.isEmpty()) revSum = "0";
// 결과 누적
sb.append(revSum).append('\n');
}
// 누적한 결과를 한 번에 출력
System.out.print(sb.toString());
// BufferedReader를 닫아 리소스를 해제합니다.
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.