PROBLEM SOLVING

[백준] X보다 작은 수

sooindev 2025. 4. 29. 23:31
728x90

문제


정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

 

 

 

입력


첫째 줄에 NX가 주어진다. (1 ≤ N, X ≤ 10,000)

둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

 

 

 

출력


X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

 

 

 

문제 풀이


나는 맨 처음 다음과 같이 풀었었다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] A = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());
        int X = Integer.parseInt(st.nextToken());

        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(st.nextToken());
            if (A[i] < X) {
                System.out.println(A[i]);
            }
        }

        br.close();
    }
}

하지만 입력을 하는 도중 오류가 나서 확인해보니 코드에 몇가지 오류가 있었다.

 

주요 문제점

  1. 첫 번째 줄에서 입력받는 것은 NX이다. 하지만 코드에서는 첫 번째 줄에서 N만 입력받고 있다.
  2. 두 번째 줄에서 정수 N개를 읽을 때, 같은 StringTokenizer에서 X를 읽으려고 하고 있다. 그러나 문제에 따르면 X는 첫 번째 줄에 있어야 한다.
  3. 출력 형식이 맞지 않는다. 각 숫자를 개별적인 줄에 출력하는 대신 공백으로 구분하여 한 줄에 출력해야 한다.

그래서 다음과 같이 수정하였다.

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));

        // 첫 번째 줄에서 N과 X를 읽는다
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int X = Integer.parseInt(st.nextToken());

        // 두 번째 줄에서 수열 A를 읽는다
        st = new StringTokenizer(br.readLine());

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
            int num = Integer.parseInt(st.nextToken());
            if (num < X) {
                sb.append(num).append(" ");
            }
        }

        System.out.println(sb.toString().trim());
        br.close();
    }
}

 

수정 사항

  1. 첫 번째 줄에서 NX를 모두 읽도록 수정했다.
  2. 두 번째 줄에서 새로운 StringTokenizer로 수열 A를 읽는다.
  3. StringBuilder를 사용하여 X보다 작은 모든 숫자를 공백으로 구분하여 저장한 다음, 한 번에 출력한다.
  4. 마지막 공백을 제거하기 위해 trim()을 사용했다.

코드에 대해서 간단히 설명하겠다.

// 첫 번째 줄에서 N과 X를 읽는다
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int X = Integer.parseInt(st.nextToken());

우선 첫 번째 줄에서 정수 NX를 읽는다.

// 두 번째 줄에서 수열 A를 읽는다
st = new StringTokenizer(br.readLine());

그리고 두 번째 줄에서 수열 A를 바로 읽는다.
나는 배열을 사용했지만 이 코드에서는 사용하지 않았다.

StringBuilder sb = new StringBuilder();

그리고 나중에 공백을 제거하기 위해 StringBuilder를 선언했다.

for (int i = 0; i < N; i++) {
    int num = Integer.parseInt(st.nextToken());
    if (num < X) {
        sb.append(num).append(" ");
    }
}

다음은 for문을 사용하여 정수 num을 입력받고, 입력받은 숫자들 중에서 X보다 작은 숫자들만 찾아서 결과 문자열에 추가하는 부분이다.

System.out.println(sb.toString().trim());

마지막으로 문자열 sb를 공백을 제거해서 출력하면 된다.

 

항상 느끼는거지만 자바에서는 StringTokenizerStringBuilder를 얼마나 잘 사용하는지에 따라 문제의 접근법이 크게 좌우되는 것 같다.
이 두 가지는 확실하게 공부해봐야겠다.