코딩테스트
[프로그래머스] 자바(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;
}
}
- 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 }
- 각 제품과 원하는 수량의 짝을 맞춰주기 위해 HashMap에 저장
- 10일동안 세일 품목을 살펴보기 위해 discount 배열을 10개씩 분리
- `Arrays.copyOfRange()` 메서드를 사용하여 복사할 배열과 범위 지정
- 예를 들어, 배열의 길이가 discount 배열의 길이가 14라면 1~10, 2~11, 3~12, 4~13, 5~14 로 분리
- 10개씩 분리한 배열을 제품명과 수량의 짝을 지어주기 위해 HashMap으로 변환
- 각 분리된 배열을 HashMap에 저장
- `discountMap.getOrDefault(arr1[j], 0) + 1`
- `arr1[j]` 가 `discountMap`에 존재하면 그 value 값을 반환하고 +1, 존재하지 않으면 `0`을 반환 후 +1 (현재 항목의 개수를 하나 증가시키는 역할)
- wantMap과 discountMap의 값 비교
- `wantMap.keySet()`
- wantMap에 저장된 모든 키를 Set으로 반환하고, 반환된 key를 순회
- `get(key)` 메서드를 사용해서 wantMap에서의 key에 대한 value 값과, discountMap에서의 key에 대한 value 값을 비교
- 두 값이 "완전히 일치" 하지 않으면 조건이 성립하지 않으므로 match 변수를 false로 설정하고 break 문으로 반복문을 종료
- 두 HashMap의 값이 완전히 일치해야 함 ⭐️
- `wantMap.keySet()`
- 전체가 일치하면(match가 true일 경우) answer 값 증가
- 두 HashMap이 완전히 일치하면 answer 값 증가
- 부분적으로 일치하는 경우에는 `answer` 값을 증가시키면 안되기 때문에, 4번 반복문 밖에서 증가시켜줘야함
🧠 배운 점
- `keySet()` 메서드를 활용하여 두 HashMap의 값을 비교하는 방법에 대해서 알게 되었다.
- `keySet()` 메서드는 HashMap에 저장된 모든 키를 Set 형태로 반환해주기 때문에, 이를 통해 HashMap의 각 값(value)을 순회하며 비교할 수 있었다.