백준 온데간데없을뿐더러

KIMYEONGJUN·2025년 12월 2일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 각 배열의 원소 개수 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();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글