[백준] X보다 작은 수

2025. 4. 29. 23:31·PROBLEM SOLVING
728x90

문제


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

 

 

 

입력


첫째 줄에 N과 X가 주어진다. (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. 첫 번째 줄에서 입력받는 것은 N과 X이다. 하지만 코드에서는 첫 번째 줄에서 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. 첫 번째 줄에서 N과 X를 모두 읽도록 수정했다.
  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());

우선 첫 번째 줄에서 정수 N과 X를 읽는다.

// 두 번째 줄에서 수열 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를 공백을 제거해서 출력하면 된다.

 

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

'PROBLEM SOLVING' 카테고리의 다른 글

[백준] 아스키 코드  (1) 2025.05.07
[백준] A + B - C  (1) 2025.05.02
[백준] 검증수  (1) 2025.04.29
[백준] 숫자의 합  (0) 2025.04.29
[백준] 수 정렬하기 2  (1) 2025.04.24
'PROBLEM SOLVING' 카테고리의 다른 글
  • [백준] 아스키 코드
  • [백준] A + B - C
  • [백준] 검증수
  • [백준] 숫자의 합
sooindev
sooindev
테스트 아카이브
    250x250
  • sooindev
    test archive
    sooindev
  • 전체
    오늘
    어제
    • DEVELOPMENT (96)
      • PROBLEM SOLVING (45)
      • SIDE PROJECT (20)
        • AUTOFINDER (20)
      • NODE.JS (21)
        • NODE.JS (12)
        • NODE.JS 웹애플리케이션 제작 (9)
      • DATABASE (4)
        • MYSQL (4)
      • JAVA (2)
  • 링크

    • GitHub
    • solved.ac
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sooindev
[백준] X보다 작은 수
상단으로

티스토리툴바