알고리즘 문제풀이/프로그래머스 문제풀이

프로그래머스 문제 풀이 - 할인 행사 (해시 맵)

줄라이퍼스트 2025. 8. 6. 21:59

 

 

XYZ 마트는 일정 금액을 내면 10일간 회원 자격을 주고, 회원에게 매일 한 가지 품목을 할인.
정현이는 쇼핑할 때 본인이 원하는 물건들을 정확한 수량만큼, 10일 안에 모두 할인받아 살 수 있을 때만 회원가입을 함

연속된 10일 동안, 할인하는 품목들이 want와 number 조건을 정확히 만족하는 시작 날짜가 몇 개인지 세는 문제

 

- 입력으로 주어지는 것들

want: 정현이가 사고 싶은 상품 이름 목록 (문자열 배열)

number: 각 상품별 원하는 수량 (정수 배열)

discount: XYZ 마트에서 날짜순으로 할인하는 상품 배열

  • 먼저 정현이가 원하는 상품과 수량을 HashMap<String, Integer>에 기록한다. (예: "apple" → 2)
  • discount 배열에서 10일씩 잘라가며 해당 기간 동안의 할인 상품 빈도를 또 HashMap으로 기록
  • 두 맵이 정확히 일치하는지 비교하면, 그 시점에 회원가입하면 된다는 뜻

 

class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
    	
        // want, number 배열의 값을 해시맵에 저장
        Map<String, Integer> wantMap = new HashMap<>();
        for (int i = 0; i < want.length; i++) {
            wantMap.put(want[i], number[i]);
        }

        int answer = 0;

        // 슬라이딩 윈도우 방식 i일부터 10일간 할인 상품 조사
        // 특정일 i에 회원가입 시 할인받을 수 있는 품목 체크
        for (int i = 0; i < discount.length - 9; i++) {
        
        	// i일 회원가입시 할인 받는 제품 및 개수를 담을 해시맵
            Map<String, Integer> discountMap = new HashMap<>();
            
            // i일 회원가입 시 할인받는 제품 및 개수로 해시맵 구성            
            for (int j = i; j < i + 10; j++) {
                String item = discount[j];
                if (wantMap.containsKey(item)) {
                    discountMap.put(item, discountMap.getOrDefault(item, 0) + 1);
                }
            }

            // 할인 상품 갯수와 원하는 제품과 수량이 정확히 일치하는 경우 카운트 증가
            if (discountMap.equals(wantMap)) {
                answer++;
            }
        }

        return answer;
    }
}