코딩테스트

[프로그래머스] 자바(Java) - 할인 행사

수방방 2024. 6. 24. 00:33

🧩 문제

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

 

프로그래머스

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

programmers.co.kr

 

💡 내가 작성한 코드

import java.util.*;

class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        Map<String, Integer> wantMap = new HashMap<>();
        
        for(int i = 0; i < want.length; i++) {
            wantMap.put(want[i], number[i]);
        }
        
        for (int i = 0; i <= discount.length - 10; i++) {
            String[] arr1 = Arrays.copyOfRange(discount, i, i + 10); 
            Map<String, Integer> discountMap = new HashMap<>();
            
            for (int j = 0; j < arr1.length; j++) {
                discountMap.put(arr1[j], discountMap.getOrDefault(arr1[j], 0) + 1);
            }
            
            boolean match = true;
            
            for(String key : wantMap.keySet()) {
                if(wantMap.get(key) != discountMap.get(key)) {
                    match = false;
                    break;
                }
            }
            
            if(match) answer++;
        }
        return answer;
    }
}
  1. want 배열과 number 배열을 HashMap으로 변환
    • 각 제품과 원하는 수량의 짝을 맞춰주기 위해 HashMap에 저장
      • `put()` 메서드를 사용하여 제품명을 HashMap의 key로, 수량을 value로 저장
    • ex ) want = [ "banana", "apple", "rice", "pork", "pot" ]
    • number = [ 3, 2, 2, 2, 1 ]
    • -> { "banana" = 3, "apple" = 2, "rice" = 2, "pork" = 2, "pot" = 1 }
  2. 10일동안 세일 품목을 살펴보기 위해 discount 배열을 10개씩 분리
    • `Arrays.copyOfRange()` 메서드를 사용하여 복사할 배열과 범위 지정
    • 예를 들어, 배열의 길이가 discount 배열의 길이가 14라면 1~10, 2~11, 3~12, 4~13, 5~14 로 분리
  3. 10개씩 분리한 배열을 제품명과 수량의 짝을 지어주기 위해 HashMap으로 변환
    • 각 분리된 배열을 HashMap에 저장
    • `discountMap.getOrDefault(arr1[j], 0) + 1`
      • `arr1[j]` 가 `discountMap`에 존재하면 그 value 값을 반환하고 +1, 존재하지 않으면 `0`을 반환 후 +1 (현재 항목의 개수를 하나 증가시키는 역할)
  4. wantMap과 discountMap의 값 비교
    • `wantMap.keySet()`
      • wantMap에 저장된 모든 키를 Set으로 반환하고, 반환된 key를 순회
    • `get(key)` 메서드를 사용해서 wantMap에서의 key에 대한 value 값과, discountMap에서의 key에 대한 value 값을 비교
      • 두 값이 "완전히 일치" 하지 않으면 조건이 성립하지 않으므로 match 변수를 false로 설정하고 break 문으로 반복문을 종료
    • 두 HashMap의 값이 완전히 일치해야 함 ⭐️
  5. 전체가 일치하면(match가 true일 경우) answer 값 증가
    • 두 HashMap이 완전히 일치하면 answer 값 증가
    • 부분적으로 일치하는 경우에는 `answer` 값을 증가시키면 안되기 때문에, 4번 반복문 밖에서 증가시켜줘야함

 

🧠 배운 점

  • `keySet()` 메서드를 활용하여 두 HashMap의 값을 비교하는 방법에 대해서 알게 되었다.
    • `keySet()` 메서드는 HashMap에 저장된 모든 키를 Set 형태로 반환해주기 때문에, 이를 통해 HashMap의 각 값(value)을 순회하며 비교할 수 있었다.