[BaekJoon] 25304번 - 영수증 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 1024MB


- 문제

준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.
영수증에 적힌,

- 구매한 각 물건의 가격과 개수
- 구매한 물건들의 총 금액
을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.

- 입력

첫째 줄에는 영수증에 적힌 총 금액 X가 주어진다.
둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다.
이후 N개의 줄에는 각 물건의 가격 a와 개수 b가 공백을 사이에 두고 주어진다.



- 출력

구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.

- 제한

1 ≤ X ≤ 1 000 000 000
1 ≤ N ≤ 100
1 ≤ a ≤ 1 000 000
1 ≤ b ≤ 10

- 예제

  입력      출력  
260000
4
20000 5
30000 2
10000 6
5000 8
Yes
250000
4
20000 5
30000 2
10000 6
5000 8
No





2. 풀이

반복문 for를 사용해 구매한 물건 가격과 개수로 계산한 총 금액영수증의 총 금액과 같은지를 비교한다.

for (초기식; 조건식; 증감식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문 작성;
}




2개의 입력방식을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스
      ① StringTokenizer 클래스
      ② split() 메서드



- 1. Scanner 클래스

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int X = sc.nextInt();
        int N = sc.nextInt();
        int sum = 0;
        
        for(int i=0;i<N;i++){ //구매한 물건 종류의 수만큼 반복
            int a = sc.nextInt();
            int b = sc.nextInt();
            sum += a*b;
        }
        
        if(X==sum) System.out.println("Yes");
        else System.out.println("No");
        
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

int형 데이터를 입력받기 위해 nextInt() 메서드를 사용한다.

+= 연산자는 왼쪽과 오른쪽의 합을 왼쪽 변수에 대입한다.
ex) sum += 1000 * 3;   =>   sum = sum + 1000 * 3;



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요




- 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));
        
        int X = Integer.parseInt(br.readLine()); 
        int N = Integer.parseInt(br.readLine()); 
        
        int sum = 0;
        
        for(int i=0;i<N;i++){ //구매한 물건 종류의 수만큼 반복
            StringTokenizer st = new StringTokenizer(br.readLine());
        
            int a = Integer.parseInt(st.nextToken()); 
            int b = Integer.parseInt(st.nextToken()); 
            sum += a*b;
        }

        if(X==sum) System.out.println("Yes");
        else System.out.println("No");
        
    }
}

readLine()은 한 줄을 통째로 읽어 String으로 반환하기 때문에, StringTokenizer 클래스의 nextToken()를 이용해 공백으로 구분된 입력값들을 순서대로 가져온다.

Integer.parseInt()을 사용해 String형을 int형으로 변환시켜준다.

+= 연산자는 왼쪽과 오른쪽의 합을 왼쪽 변수에 대입한다.
ex) sum += 1000 * 3;   =>   sum = sum + 1000 * 3;



[여기서 잠깐!]

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));
        
        int X = Integer.parseInt(br.readLine()); 
        int N = Integer.parseInt(br.readLine()); 
        
        int sum = 0;
        
        for(int i=0;i<N;i++){ //구매한 물건 종류의 수만큼 반복
            String[] arr = br.readLine().split(" ");
        
            int a = Integer.parseInt(arr[0]); 
            int b = Integer.parseInt(arr[1]); 
            sum += a*b;
        }

        if(X==sum) System.out.println("Yes");
        else System.out.println("No");
        
    }
}

readLine()을 통해 한 줄로 받은 String 데이터를 split(" ") 메서드를 사용해 공백 단위로 나눈 뒤 배열에 저장한다.





3. Scanner VS BufferedReader 성능 비교

image

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.





관련 페이지

Categories:

Updated:

Leave a comment