[BaekJoon] 10156번 - 과자 (java)
1. 문제
👉 문제 바로가기
- 조건
시간 제한 | 메모리 제한 |
---|---|
1초 | 256MB |
- 문제
동수는 제과점에 과자를 사러 가는데 현재 가진 돈이 모자랄 경우 부모님께 모자란 돈을 받으려고 한다. 과자 한 개의 가격이 K, 사려고 하는 과자의 개수가 N이고, 현재 가진 돈의 액수를 M이라 할 때 여러분은 동수가 부모님께 받아야 하는 모자란 돈을 계산하려고 한다.
예를 들어, 과자 한 개의 가격이 30원, 사려고 하는 과자의 개수가 4개, 현재 동수가 가진 돈이 100원이라 할 때, 동수가 부모님께 받아야 하는 돈은 20원이다. 과자 한 개의 가격이 250원, 사려고 하는 과자의 개수가 2개, 현재 동수가 가진 돈이 140원이라 할 때, 동수가 부모님께 받아야 하는 돈은 360원이다. 과자 한 개의 가격이 20원, 사려고 하는 과자의 개수가 6개, 현재 동수가 가진 돈이 120원이라 할 때 동수가 부모님께 받아야 하는 돈은 0원이다. 과자 한 개의 가격이 20원, 사려고 하는 과자의 개수가 10개, 현재 동수가 가진 돈이 320원이라 할 때 동수가 부모님께 받아야 하는 돈은 역시 0원이다.
과자 한 개의 가격, 사려고 하는 과자의 개수와 동수가 현재 가진 돈의 액수가 주어질 때 동수가 부모님께 받아야 하는 돈의 액수를 출력하는 프로그램을 작성하시오.
- 입력
첫 번째 줄에는 과자 한 개의 가격 K, 사려고 하는 과자의 개수 N, 현재 동수가 가진 돈 M이 각각 공백을 사이에 두고 주어진다. 단, K, N은 1,000 이하의 양의 정수이고, M은 10만 이하의 양의 정수이다. (1 ≤ K, N ≤ 1,000, 1 ≤ M ≤ 100,000이다.)
- 출력
첫 줄에 동수가 부모님께 받아야 하는 돈의 액수를 출력한다.
- 예제
입력 | 출력 |
---|---|
300 4 1000 | 200 |
250 2 140 | 360 |
20 6 120 | 0 |
20 10 320 | 0 |
2. 풀이
2개의 입력방식을 사용해서 결과를 출력한다.
- Scanner 클래스
- BufferedReader 클래스
① StringTokenizer 클래스
② split() 메서드
2-1. Scanner 클래스
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int K = sc.nextInt(); // 과자 1개 가격
int N = sc.nextInt(); // 과자 개수
int M = sc.nextInt(); // 내가 가진 돈
if(K * N - M < 0) System.out.println(0);
else System.out.println(K * N - M);
}
}
위와같이 객체를 생성할 때, Scanner(System.in) 에서
System.in
은 입력한 값을Byte 단위
로 읽는 것을 뜻한다.
int형 데이터를 입력받기 위해
nextInt()
메서드를 사용한다.
[여기서 잠깐!]
2-2. BufferedReader 클래스 사용
BufferedReader는 readLine()
메서드를 사용해 한 행을 전부 읽는다.
이를 공백단위로 분리해야 하는데, 두가지 분리 방법으로 문제를 풀어보자.
① StringTokenizer 클래스를 사용하여 분리해주는 방법
② split() 을 사용하는 방법
① StringTokenizer 클래스를 이용
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 K = Integer.parseInt(st.nextToken()); // 과자 1개 가격
int N = Integer.parseInt(st.nextToken()); // 과자 개수
int M = Integer.parseInt(st.nextToken()); // 내가 가진 돈
if(K * N - M < 0) System.out.println(0);
else System.out.println(K * N - M);
}
}
readLine()
은 한 줄을 통째로 읽어 String으로 반환하기 때문에, StringTokenizer 클래스의nextToken()
를 이용해 공백으로 구분된 입력값들을 순서대로 가져온다.
Integer.parseInt()
을 사용해 String형을int형으로 변환
시켜준다.
[여기서 잠깐!]
BufferedReader 클래스
에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.② split() 을 사용
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arr = br.readLine().split(" ");
int K = Integer.parseInt(arr[0]); // 과자 1개 가격
int N = Integer.parseInt(arr[1]); // 과자 개수
int M = Integer.parseInt(arr[2]); // 내가 가진 돈
if(K * N - M < 0) System.out.println(0);
else System.out.println(K * N - M);
}
}
readLine()
을 통해 한 줄로 받은 String 데이터를split(" ")
메서드를 사용해 공백 단위로 나눈 뒤 배열에 저장한다.
3. 성능 비교
위에서 부터 순서대로
BufferedReader + StringTokenizer
BufferedReader + split()
Scanner
입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.
관련 페이지
Leave a comment