Algorithm/Programmers Java

[JAVA] 프로그래머스 level2 할인 행사

제우제우 2024. 7. 29. 11:33

https://school.programmers.co.kr/learn/courses/30/lessons/131127

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코딩테스트 연습 > 연습문제 > 할인 행사

 

문제 접근

문제 핵심 

제품과 수량이 할인하는 날짜가 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려한다.

할인하는 제품은 하루에 하나씩만 구매할 수 있다.

원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return 

 

현이가 원하는 제품들과 해당 제품의 수량을 기록하는 map 생성, 데이터 넣기 

static HashMap<String, Integer> cur = new HashMap<>();
 
for(int i = 0; i < want.length; i++){
    wants.put(want[i], number[i]);
}

 

해당 날짜에서 현이가 원하는 제품들의 수량이 올바르게 있는지 확인할 때 사용하기 위한 List

 static List<String> keys;
 
  keys = new ArrayList<>(wants.keySet());

 

할인하는 제품들을 기록하는 map

static HashMap<String, Integer> cur = new HashMap<>();

 

validation()

현이가 원하는 제품들의 수량이 모두 있는지 체크하는 용도의 static 메서드

하나라도 만족하지 못하면 return false

만약 validation의 결과가 true 라면 answer(최종 결과물) 증가

public static boolean validation() {
    for(String key : keys){
        if(cur.getOrDefault(key, 0) < wants.get(key)) return false;
    }
    return true;
}

 

첫 번째 날짜부터 10일 동안의 할인 항목 값 넣기 + 검사 

for(int i = 0; i < 10; i++){
    cur.put(discount[i], cur.getOrDefault(discount[i], 0) + 1);
}

if(validation()) answer++;

 

11일 ~ 끝나는 날짜 

n일날에 할인하는 항목은 추가 (n-10)일에 할인했던 항목은 삭제 + 매번 검사하기 

for(int i = 10; i < discount.length; i++) {
    cur.put(discount[i - 10], cur.get(discount[i - 10]) - 1);
    cur.put(discount[i], cur.getOrDefault(discount[i], 0) + 1);
    if(validation()) answer++;
}

 

정답 코드 

import java.util.*;
class Solution {
    static HashMap<String, Integer> wants = new HashMap<>();
    static HashMap<String, Integer> cur = new HashMap<>();
    static List<String> keys;
    public int solution(String[] want, int[] number, String[] discount) {
        
        int answer = 0;
          
        for(int i = 0; i < want.length; i++){
            wants.put(want[i], number[i]);
        }
        keys = new ArrayList<>(wants.keySet());
        
        for(int i = 0; i < 10; i++){
            cur.put(discount[i], cur.getOrDefault(discount[i], 0) + 1);
        }
       
        if(validation()) answer++;
        
        for(int i = 10; i < discount.length; i++) {
            cur.put(discount[i - 10], cur.get(discount[i - 10]) - 1);
            cur.put(discount[i], cur.getOrDefault(discount[i], 0) + 1);
            if(validation()) answer++;
        }
        
        return answer;
    }
    public static boolean validation() {
        for(String key : keys){
            if(cur.getOrDefault(key, 0) < wants.get(key)) return false;
        }
        return true;
    }
}