PROBLEM SOLVING
[백준] X보다 작은 수
sooindev
2025. 4. 29. 23:31
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();
}
}
하지만 입력을 하는 도중 오류가 나서 확인해보니 코드에 몇가지 오류가 있었다.
주요 문제점
- 첫 번째 줄에서 입력받는 것은
N
과X
이다. 하지만 코드에서는 첫 번째 줄에서N
만 입력받고 있다. - 두 번째 줄에서 정수
N
개를 읽을 때, 같은StringTokenizer
에서X
를 읽으려고 하고 있다. 그러나 문제에 따르면X
는 첫 번째 줄에 있어야 한다. - 출력 형식이 맞지 않는다. 각 숫자를 개별적인 줄에 출력하는 대신 공백으로 구분하여 한 줄에 출력해야 한다.
그래서 다음과 같이 수정하였다.
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();
}
}
수정 사항
- 첫 번째 줄에서
N
과X
를 모두 읽도록 수정했다. - 두 번째 줄에서 새로운
StringTokenizer
로 수열A
를 읽는다. StringBuilder
를 사용하여X
보다 작은 모든 숫자를 공백으로 구분하여 저장한 다음, 한 번에 출력한다.- 마지막 공백을 제거하기 위해
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
를 얼마나 잘 사용하는지에 따라 문제의 접근법이 크게 좌우되는 것 같다.
이 두 가지는 확실하게 공부해봐야겠다.