할인행사 : Level2
https://school.programmers.co.kr/learn/courses/30/lessons/131127
풀이
class Solution {
static public int solution(String[] want, int[] number, String[] discount) {
int answer = 0;
for (int i = 0; i < discount.length - 9; i++) {
int idx = 0;
for (int j = idx; j < want.length; j++) {
int num = number[j];
for (int k = i; k < i + 10; k++) {
if (discount[k].equals(want[j])) num--;
}
if (num > 0) {
break;
}
idx++; // 다음 상품을 위해 idx 증가
}
if (idx == want.length) answer++;
}
return answer;
}
}
ㄴ discount 배열을 순회하며, 할인 쿠폰을 10개씩 묶어서 확인한다. (for (int i = 0; i < discount.length - 9; i++))
=> discount = ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"] 배열을 10개씩 묶을 경우
- ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice"]
- ["apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot"]
- ["apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana"]
- ["banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple"]
- ["rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"]
=> 이렇게 5개의 묶음이 나오므로 5번 반복하도록 해야 한다.
=> 그러므로 discount.length - 9 (10개씩 묶기 때문) 만큼 반복하도록 해야한다.
ㄴ want 배열을 순회하면서 각 상품에 대해 할인 쿠폰을 사용하면 수량이 충분한지 확인한다.
- num 변수는 해당 상품의 수량을 나타낸다.
- for (int k = i; k < i + 10; k++)는 현재 고려 중인 할인 쿠폰의 범위를 나타낸다. 10개의 쿠폰을 순차적으로 확인한다.
- if (discount[k].equals(want[j])) num--;은 현재 상품에 대해 할인 쿠폰을 사용하는 경우 해당 상품의 수량을 1 감소킨다.
- 만약 할인 쿠폰을 모두 사용해도 상품을 아직 구매해야된다면, 반복문을 종료하고 다음 상품을 확인하도록 한다.
ㄴ 상품 수량이 0보다 큰 경우, 해당 상품을 구매할 수 없으므로 반복문을 중단하고 다음 상품을 확인한다.
ㄴ 모든 상품에 대해 할인 쿠폰을 사용하여 구매할 수 있다면 (idx가 상품 리스트의 길이와 같다면), answer를 증가시키도록 했다.
'코딩테스트 > programming_JAVA' 카테고리의 다른 글
[Java] baekjoon_2751 : 수 정렬하기 2 (2) | 2024.01.10 |
---|---|
[Java] baekjoon_2798 : 블랙잭 (5) | 2024.01.09 |
[Java] baekjoon_2839 : 설탕 배달 (1) | 2024.01.08 |
[Java] baekjoon_14494 : 다이나믹이 뭐예요? (5) | 2024.01.05 |
[Java] baekjoon_1966 : 프린터 큐 (0) | 2024.01.04 |