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());
int K = Integer.parseInt(st.nextToken());
int[] coin = new int[N];
for(int i = 0; i < N; i++) {
coin[i] = Integer.parseInt(br.readLine());
}
int count = 0;
for(int i = N - 1; i >= 0; i--) {
// 현재 동전의 가치가 K보다 작거나 같아야지 구성가능하다.
if(coin[i] <= K) {
// 현재 가치의 동전으로 구성할 수 있는 개수를 더해준다.
count += (K / coin[i]);
K = K % coin[i];
}
}
System.out.println(count);
}
}
BufferedReader와 StringTokenizer는 Java에서 텍스트를 처리하기 위한 클래스입니다.
예를 들어, 사용자가 "100 500" 이라는 문자열을 입력했다면, StringTokenizer는 이를 "100"과 "500" 두 개의 토큰으로 나눕니다. 이후 nextToken() 메소드를 통해 각 토큰을 차례로 가져올 수 있습니다.
따라서 이 코드에서 BufferedReader와 StringTokenizer는 사용자의 입력을 빠르게 처리하고, 이를 분리하는 역할을 합니다.
IOException은 입력-출력 작업에서 발생할 수 있는 예외를 나타내는 클래스입니다. Java에서는 입력-출력 관련 동작에서 예외가 발생할 가능성이 있으므로 이를 명시적으로 처리하도록 요구합니다.
예를 들어, 시스템 자원이 부족하거나, 네트워크 연결이 끊어지는 등의 이유로 입력을 정상적으로 처리할 수 없을 때 이런 예외가 발생합니다.
따라서 IOException을 사용하는 이유는 이런 예외 상황을 처리하고, 프로그램이 안정적으로 동작하도록 하기 위함입니다. Java에서는 이런 예외 상황을 '체크 예외(checked exception)'라고 부르며, 컴파일러가 예외 처리를 강제하는 특징이 있습니다. 즉, 예외가 발생할 수 있는 메소드를 호출하는 코드에서는 반드시 이 예외를 catch하거나 다시 throw해야 합니다. 이 코드에서는 main 메소드가 IOException을 throw하도록 선언되어 있습니다.