[프로그래머스] 할인 행사 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/131127
입력 : 원하는 제품을 나타내는 문자열 배열 want[], 원하는 제품의 수량을 나타내는 정수 배열 number[], 마트에서 할인하는 제품을 나타내는 문자열 배열 discount[] (1 ≤ want.length = number.length ≤ 10, 10 ≤ discount.length ≤ 100,000)
출력 : 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수. 단, 가능한 날이 없으면 0을 리턴
O(n)
슬라이딩 윈도우
getOrDefault(Object key, V defaultValue)
key: 맵에서 찾고자 하는 키
defaultValue: 지정한 키가 맵에 존재하지 않을 때 반환할 기본값
구현
import java.util.*;
class Solution {
public int solution(String[] want, int[] number, String[] discount) {
int count = 0;
// want와 number를 Map에 저장
Map<String, Integer> wantMap = new HashMap<>();
for (int i = 0; i < want.length; i++) {
wantMap.put(want[i], number[i]);
}
// 10일간의 구간을 확인하기 위해 슬라이딩 윈도우 기법을 사용
for (int i = 0; i <= discount.length - 10; i++) {
Map<String, Integer> discountMap = new HashMap<>();
// 현재 10일간의 제품을 맵에 저장
for (int j = 0; j < 10; j++) {
String product = discount[i + j];
discountMap.put(product, discountMap.getOrDefault(product, 0) + 1);
}
// 현재 구간에서 원하는 제품을 모두 구매할 수 있는지 확인
boolean canBuyAll = true;
for (String product : wantMap.keySet()) {
if (discountMap.getOrDefault(product, 0) < wantMap.get(product)) {
canBuyAll = false;
break;
}
}
// 만약 모두 구매할 수 있다면 카운트 증가
if (canBuyAll) {
count++;
}
}
return count;
}
}