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

Date:     Updated:

카테고리:

태그:

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

10871번 문제 ☞ https://www.acmicpc.net/problem/10871

난이도 ☞ [★2]

X보다 작은 수

  • 문제
    • 정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
    • 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
      둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
    • X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

      예제입력 예제출력
      10 5
      1 10 4 9 2 3 8 5 7 6
      1 4 2 3

내가 푼 풀이

이번 문제는 크게 배열에 담아서도 풀이할 수 있고, 배열에 담지 않고도 풀이할 수 있습니다. 문제에서 보다시피 이번 문제는 forif의 조합으로 푸는 문제임을 알 수 있습니다. 우선 풀이 1은 배열을 사용하여 Scanner로 풀이한 코드입니다.

[ 풀이 1 ]

메모리 : 31480KB
시간 : 592ms

Scanner

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);

		int N = s.nextInt();
		int X = s.nextInt();
		int[] arr = new int[N];

		for (int i = 0; i < N; i++) {
			arr[i] = s.nextInt();
		}
		for (int i = 0; i < N; i++)
			if (arr[i] < X) {
				System.out.print(arr[i] + " ");
			}
	}
}

위의 방식은 제일 기본적인 Scanner방식입니다. 다음 풀이는 위에서 말씀드린 것과 같이 BufferedReader로 문제를 풀어보려고 하는데요. 대신 배열에 담지 않고 풀이하는 방법으로 코드를 작성해보았습니다. 그리고 코드 아래 쪽에 더 중요한 내용이 있으니 꼭 확인하시기 바랍니다.

[ 풀이 2 ]

메모리 : 15324KB
시간 : 164ms

BufferedReader

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));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		int N = Integer.parseInt(st.nextToken());
		int X = Integer.parseInt(st.nextToken());

		StringBuilder sb = new StringBuilder();
		
		st = new StringTokenizer(br.readLine(), " ");
		
		for (int i = 0; i < N; i++) {
			int V = Integer.parseInt(st.nextToken());
			if (V < X)
				sb.append(V).append(" ");
		}
		System.out.println(sb);
	}
}

위 코드는 배열에 담지 않고, 배열에 담을 숫자값을 받되 애초에 X보다 작은 수만 담아 그것만 출력하는 식으로 구현이 되어 있는 코드입니다.
그리고 StringTokenizer를 두번 사용한 것에 대해 자료가 많이 안 나오는 것 같은데, 그 부분에 대해 조금 설명을 드리려고 합니다.
기본적으로 StringTokenizer는 문자열 분리자이고, StringTokenizer st = new StringTokenizer(br.readLine(), " ");br.readLine(), 즉 ‘한 줄을 문자열로 읽고 공백(“ “)을 기준으로 분리한다.’라는 의미입니다.
이것을 가지고 문제를 다시 보시면 두 줄을 입력받고, 첫번째 StringTokenizer에서 값을 읽고 분리된 토큰을 반환하여 각각 N과 X에 저장을 합니다.
그래서 첫번째는 여기서 끝이나게 되며, N의 문자열을 또 한줄로 이어 받아 공백(“ “)을 기준으로 분리한 뒤 for문을 통해 st.nextToken()으로 분리된 문자열을 하나씩 반환하며 X보다 조건에 대한 여부를 따져 출력을 하고 있는 것입니다.

BKJN 카테고리 내 다른 글 보러가기

댓글 남기기