[JAVA] 백준 10871 (X보다 작은 수)

문제: 정수 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.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int N = Integer.parseInt(st.nextToken());   //수열에 받을 개수 : N
        int X = Integer.parseInt(st.nextToken());   //정수: 수열과 비교할 정수 X

        StringBuilder sb = new StringBuilder();

        st = new StringTokenizer(br.readLine(), " ");

        for (int i = 0; i < N; i++) {
            int result = Integer.parseInt(st.nextToken());

            if (result < X) {
                sb.append(result).append(" ");
            }
        }
        System.out.print(sb);
    }
}

처음 생각한 흐름

1.변수 선언 (배열A, int X)
2.for (0~A.length 반복) {
	if A[i]<X)
		print(A[i] + " ")
   }

문제점

  1. 위의 흐름을 쓰려면 BufferedReader보다 Scanner가 적합하다
  2. 처음의 문제 이해가 부족했다. A는 배열의 개수이고 배열은 따로 선언을 해야된다
  3. 그리고 for문을 사용해 배열[i]의 값을 받아와야 된다.
  4. 위의 조건이 만족되면 이제 원래 생각한 for문을 사용한다.

referrence (br + 배열X)

1.BufferedReader를 사용하여 입력을 받고, 띄어쓰기를 기준으로 구분하기 위해 StringTokenizer도 사용한다. 2.for문을 수열의 개수 N만큼 반복 2-1. 수열 result에는 N개만큼의 수를 입력받는다 2-2. 만약 result가 X보다 작다면 Stringbuilder를 사용하여 result의 값과 띄어쓰기(“ “)를 이어준다

  1. print로 출력하면 끝!

StringTokenizer 생성자

1)StringTokenizer st = new StringTokenizer(문자열); //띄어쓰기를 기준으로 분리 2)StringTokenizer st = new StringTokenizer(문자열, 구분자); //구분자를 기준으로 분리

StringTokenizer vs split

split: 정규식을 기반으로 자르는 로직으로서 내부가 복잡 StringTokenizer: nextToken()메소드는 단순히 공백 자리를 땡겨 채우는 것이라 속도가 차이남