문제
준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.
영수증에 적힌,
- 구매한 각 물건의 가격과 개수
- 구매한 물건들의 총금액
을 보고, 구매한 물건의 가격과 개수로 계산한 총금액이 영수증에 적힌 총금액과 일치하는지 검사해 보자.
입력 조건
첫째 줄에는 영수증에 적힌 총금액 X가 주어진다.
둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다.
이후 N개의 줄에는 각 물건의 가격 a와 b가 공백을 사이에 두고 주어진다.
출력 조건
구매한 물건의 가격과 개수로 계산한 총금액이 영수증에 적힌 총금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.
풀이
문제를 해석하는데 시간이 꽤 걸렸다...;; 머리가 왜 이렇게 안 돌아가는지... 첫 입력에는 총가격을 입력받아주면 되고, 두 번째 줄에는 물건의 종류가 총 몇 가지인지 입력을 받아준 뒤에 가격과 개수를 입력받아주면 물건의 종류가 총 4개까지만 연산을 받아주고 끝나는...? 그런 느낌이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int total = scanner.nextInt();
int n = scanner.nextInt();
int sum = 0;
for (int i=0; i<n; i++) {
int price = scanner.nextInt();
int quantity = scanner.nextInt();
sum += price * quantity;
}
if (sum == total) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
우선 입력을 어떻게 받아줄 것인지부터 고려를 해야 하는데
int total = scanner.nextInt();
int n = scanner.nextInt();
int sum = 0;
int sum = 0; 을 알다시피 초기값과 연산이 끝날 때마다 값을 초기화해 주기 위해서? 저렇게 해줘야만 한다.
이렇게 해주지 않으면 누적값을 계산할 경우 값을 더하는데 문제가 생길 수 있기 때문이다.
for (int i=0; i<n; i++) {
int price = scanner.nextInt();
int quantity = scanner.nextInt();
sum += price * quantity;
}
for문을 돌려서 예제 입력대로 4까지만 더할 수 있도록 그냥 뭐 숫자만 넣어주면 끝이다.
입력값은 물건의 가격과 물건 개수를 넣어주면 된다.
마지막 부분에서 조금 헤맸는데
sum += price * quantity; 이 코드는 두 가지 연산을 동시에 수행합니다.
price * quantity : 각 물품의 가격(price)과 수량(quantity)을 곱하여 해당 물품의 총가격을 계산합니다. sum +=... : 위에서 계산된 총가격을 기존의 sum에 더합니다.
sum +=... 는 sum = sum +... 과 동일한 의미입니다. 즉, 기존 sum 값에 새로운 값을 더하여 sum을 업데이트합니다. 따라서, 이 코드는 "각 물품의 총가격을 계산한 후, 그 값을 sum에 더해 sum을 업데이트한다"라고 풀어서 설명할 수 있습니다.
이런 이유로 사용한다는데 for문이 끝날 때까지 저 연산이 되는 모든 값을 저장하고 합쳐주는...? 그런 느낌으로 알고 있다.
boolean 값을 넣어줘야 해서 넣었다.
if (sum == total) {
System.out.println("Yes");
} else {
System.out.println("No");
}
예제와 동일하게 출력된다.
백준에서도 잘 통과되었다.
정리
아직도 틀 잡는 게 익숙하지가 않다.
어떤 값들을 어떻게 입력받을지를 고민하는 시간이 제일 오래 걸리는 것 같다.
'Knowledge > Algorithm' 카테고리의 다른 글
[9086/JAVA] 문자열 (0) | 2024.01.06 |
---|---|
[2480/JAVA] 주사위 세개 (0) | 2024.01.02 |
[2438/JAVA] 별 찍기 - 1 (0) | 2023.12.30 |
[10872/JAVA] 팩토리얼 (0) | 2023.12.29 |
[10951/JAVA] A+B - 4 (0) | 2023.12.23 |
쓰임 있는 사람이 되기 위해 노력 중입니다.