
내가 생각했을때 문제에서 원하는부분
첫째 줄에 각 배열의 원소 개수 N이 주어진다.
둘째 줄에 배열 A의 원소 A1,A2,... ,AN이 차례대로 공백으로 구분되어 주어진다.
셋째 줄에 배열 B의 원소 B1,B2,... ,BN이 차례대로 공백으로 구분되어 주어진다.
X와 Y중 더 작은 값을 출력한다.
X와 Y가 같은 경우 그 값을 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 준비 (BufferedReader):
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader 객체 br을 생성하여 키보드 입력을 처리할 준비를 한다.
N 값 읽기:
int N = Integer.parseInt(br.readLine());
br.readLine()을 호출하여 첫째 줄에 입력된 문자열(예: "5")을 읽는다.
Integer.parseInt() 메서드를 사용하여 이 문자열을 정수(int) 타입으로 변환하고 N 변수에 저장한다.
이 N은 앞으로 반복문을 돌 때 몇 번 돌지 결정하는 역할을 한다.
배열 A 처리 및 X 생성:
StringBuilder sbA = new StringBuilder();
StringTokenizer stA = new StringTokenizer(br.readLine(), " ");
long X = Long.parseLong(sbA.toString());
StringBuilder sbA = new StringBuilder();: X를 만들기 위해 여러 숫자를 문자열로 계속 이어 붙여야 하는데, 이때 String 객체를 + 연산자로 계속 더하면 메모리 효율이 떨어지고 속도도 느려질 수 있다.
StringBuilder는 이런 문자열 조작을 훨씬 효율적으로 처리할 수 있도록 도와주는 클래스이다.
sbA라는 이름으로 StringBuilder 객체를 하나 생성한다.
StringTokenizer stA = new StringTokenizer(br.readLine(), " ");: br.readLine()으로 배열 A의 원소들이 있는 줄(예: "5 4 3 2 1")을 통째로 읽어온다.
그리고 이 문자열을 StringTokenizer 객체 stA에 넣어준다.
이때 " " (공백)을 구분자로 지정했으므로, 공백을 기준으로 문자열을 조각조각 나눌 준비가 된다.
for(int i = 0; i < N; i++) { sbA.append(stA.nextToken()); }: N번 반복하면서, stA.nextToken()을 호출하여 토큰화된 숫자 문자열(예: "5", "4", "3", ...)을 하나씩 가져온다.
이 가져온 문자열을 sbA.append() 메서드를 사용하여 StringBuilder 객체에 차례대로 붙여준다.
이렇게 하면 sbA 안에는 "54321"과 같은 최종 문자열이 만들어진다.
long X = Long.parseLong(sbA.toString());: sbA에 만들어진 최종 문자열("54321")을 sbA.toString()으로 다시 String 타입으로 변환한 다음, Long.parseLong() 메서드를 사용하여 이 문자열을 long 타입의 숫자로 변환한다.
int가 아닌 long을 사용하는 것은 문제에서 언급된 것처럼 결과 숫자가 매우 커질 수 있기 때문이다.
변환된 값은 X 변수에 저장된다.
배열 B 처리 및 Y 생성:
배열 A를 처리하는 과정과 동일하게 배열 B도 처리한다.
sbB라는 새로운 StringBuilder와 stB라는 StringTokenizer를 사용하여 Y 값을 만든다.
X와 Y 비교 및 출력:
if(X < Y) 조건문을 사용하여 X가 Y보다 작은지 확인한다.
만약 X가 더 작다면, X의 값을 출력한다.
그렇지 않다면(즉, Y가 더 작거나 X와 Y가 같다면), Y의 값을 출력한다.
else 문 하나로 Y가 더 작은 경우와 X == Y인 경우를 모두 처리할 수 있다.
입력 스트림 닫기 (br.close()):
br.close();: BufferedReader는 시스템 자원을 사용하므로, 사용 후에는 반드시 닫아주어 자원 누수를 방지한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 31833번 문제
public class Main1224 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1. N 값 읽기
int N = Integer.parseInt(br.readLine());
// 2. 배열 A의 원소들을 읽고 X를 구성
StringBuilder sbA = new StringBuilder(); // 효율적인 문자열 연결을 위해 StringBuilder 사용
StringTokenizer stA = new StringTokenizer(br.readLine(), " "); // 공백으로 구분된 문자열 토큰화
for(int i = 0; i < N; i++) {
sbA.append(stA.nextToken()); // 각 숫자를 문자열 형태로 이어 붙이기
}
long X = Long.parseLong(sbA.toString()); // 완성된 문자열을 long 타입 숫자로 변환
// 3. 배열 B의 원소들을 읽고 Y를 구성
StringBuilder sbB = new StringBuilder(); // 효율적인 문자열 연결을 위해 StringBuilder 사용
StringTokenizer stB = new StringTokenizer(br.readLine(), " "); // 공백으로 구분된 문자열 토큰화
for(int i = 0; i < N; i++) {
sbB.append(stB.nextToken()); // 각 숫자를 문자열 형태로 이어 붙이기
}
long Y = Long.parseLong(sbB.toString()); // 완성된 문자열을 long 타입 숫자로 변환
// 4. X와 Y 중 더 작은 값 출력
if(X < Y) {
System.out.println(X);
} else {
System.out.println(Y);
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.