문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131127#
문제 풀이
want[]:품목, number[]:품목별 개수, discount[]:할인품목
number의 총합은 10
원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수 return.
각 want와 number를 hashMap<String, Integer>에 저장 후 discount[]에서 0~9번까지 품목별 개수 -1해준다.
index가 10이상일 경우 index-10에 해당하는 품목 개수 +1, index에 해당하는 품목 개수 -1
hashMap number가 모두 0이면 조건이 충족하므로 answer++
1번을 예시로 들면,
["banana", "apple", "rice", "pork", "pot"], [3, 2, 2, 2, 1]
각 품목별 수량을 HashMap<String, Integer>에 저장 후 discount에 10개씩 끊어서 수량을 변경하며 체크한다.
["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"]
0번인 chicken부터 9번인 rice까지 확인하면 각 품목별 개수는 [1, -1, 0, 0, 1]로 apple은 1개가 많고 banana와 pot이 1개씩 부족하므로 다음으로 넘어간다.
이 후는 index-10 품목의 개수를 +1, index 품목을 -1해준다. 현재의 경우 chicken은 필요 품목에 없으므로 pass, 10번 index pot은 -1을 하면 [1, -1, 0, 0, 0] 이 된다. 아직 전체가 0이 아니므로 다음으로 넘어가면 apple은 +1 banana는 -1이 되어 [0, 0, 0, 0, 0]이 되어 조건을 만족한다.
코드
import java.util.*;
class Solution {
Map<String, Integer> wantMap;
public int solution(String[] want, int[] number, String[] discount) {
// init
int answer = 0;
wantMap = new HashMap<>();
for(int i=0; i<want.length; i++) {
wantMap.put(want[i], number[i]);
}
// cal
for(int i=0; i<discount.length; i++) {
String food = discount[i];
if(i >= 10) {
String prevFood = discount[i-10];
if(wantMap.containsKey(prevFood)) {
wantMap.put(prevFood, wantMap.get(prevFood) + 1);
}
}
if(wantMap.containsKey(food)) {
wantMap.put(food, wantMap.get(food) - 1);
}
if(isAllDiscount()) {
answer++;
}
}
// wantMap.forEach((key, value) -> {
// System.out.println(key + " " + value);
// });
return answer;
}
public boolean isAllDiscount() {
for(String key : wantMap.keySet()) {
if(wantMap.get(key) != 0) {
return false;
}
}
return true;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 가장 많이 받은 선물 (2) | 2024.01.25 |
---|---|
[Programmers] 도넛과 막대 그래프 (0) | 2024.01.24 |
[Programmers] 상담원 인원 (0) | 2024.01.22 |
[Algorithm][Programmers] 베스트엘범 (Java) (0) | 2023.08.20 |
[Algorithm][Programmers] 의상 (Java) (0) | 2023.08.02 |