위의 문제에 대해서 처음에는 BufferedReader
를 사용하여 코드를 구성해보았다.
Scanner
함수에는 .nextInt()
의 메소드를 이용하면 띄어쓰기를 기준으로 값들을 서로 분류해주지만,
BufferedReader
의 경우에는String
의 형태로 입력값을 받아와 띄어쓰기를 기준으로 값들을 분류한 이후, 다시int
형으로 바꿔줘야 한다.
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 str = new StringTokenizer(br.readLine(), " "); // StringTokenizer로 입력받은 값에서 빈칸을 구분함.
int[] value = new int[2];
int N, X;
for (int i = 0; i < value.length; i++) {
value[i] = Integer.parseInt(str.nextToken()); // N, X값 대입(첫줄)
}
N = value[0];
X = value[1]; // 차례대로 수열의 길이값 N, 비교값 X 입력
int[] A = new int[N];
for (int i = 0; i < A.length; i++) {
A[i] = Integer.parseInt(str.nextToken()); // 수열 A에 들어가는 값들
if (X > A[i]) {
System.out.print(A[i] + " ");
}
}
}
}
처음에는 위와같이 코드를 구성하였으나
10 5
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.StringTokenizer.nextToken(StringTokenizer.java:347)
at Main.main(Main.java:23)
NoSuchElementException
오류가 발생한다.
알고보니 아직 BufferedReader
와 StringTokenizer
의 사용이 익숙치 않아서 발생한 문제였다.
BufferedReader
의 변수인 br로 입력받은 값을 StringTokenizer
로 전달하는 방식인데,
위의 코드를 보면 N,X값을 대입할때와
수열 A의 항목들을 지정할때 같은 값이 들어가버리는 것이다.
한마디로, 첫줄에 수열 길이값10과 비교값5를 넣었는데,
넣는 동시에 수열의 항목으로 {10, 5}로 들어가버리니 수열의 길이가 맞지 않다는 것이다.
그래서 해결책으로 중간에서 str의 값을 새로 받아 대입이 되도록 하였다.
(추가로 쓸데없는 첫번째 배열을 빼서 N,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));
StringTokenizer str = new StringTokenizer(br.readLine(), " "); // 입력받은 값에서 빈칸을 구분함.
int N = Integer.parseInt(str.nextToken());
int X = Integer.parseInt(str.nextToken()); // 차례대로 수열의 길이값 N, X 입력
str = new StringTokenizer(br.readLine(), " "); // 새로운 값 입력
int[] A = new int[N];
for (int i = 0; i < A.length; i++) {
A[i] = Integer.parseInt(str.nextToken()); // 수열 A에 들어가는 값들
if (X > A[i]) {
System.out.print(A[i] + " "); // A에서 X보다 작은값들 출력.
}
}
}
}