[단계별로 풀어보기] 10807번 X보다 작은 수 (1차원 배열)

Jun_Gyu·2023년 3월 1일
0

BackJoon Online Judge

목록 보기
2/18

위의 문제에 대해서 처음에는 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 오류가 발생한다.
알고보니 아직 BufferedReaderStringTokenizer의 사용이 익숙치 않아서 발생한 문제였다.

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보다 작은값들 출력. 
			}
		}
	}
}


profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글