✔ 할인 행사
문제 분석하기
해시 맵에 제품과 갯수를 저장한 후,
할인하는 제품을 10개씩 끊어가며 모든 제품을 모두 할인받을 수 있는지 확인하도록 함
손으로 풀어보기
- 제품과 갯수를 저장
- 할인하는 제품을 10개씩 끊어가며 모든 제품을 할인받을 수 있는지 확인함
- 날짜의 총 일수를 반환
슈도코드 작성하기
want(정현이가 원하는 제품)
number(정현이가 원하는 제품의 수량)
discount(XYZ 마트에서 할인하는 제품)
answer(회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수)
for(i -> 0부터 discount의 길이 - 10까지) {
if(모두 할인 받을 수 있는지 함수(want, number, discount, i)
answer 증가
}
answer 반환
모두 할인 받을 수 있는지 함수 {
map(제품과 제품의 수량을 저장할 HashMap)
map에 want와 number 저장
for(x -> i부터 10만큼) {
if(map에 discount[i]가 존재한다면) {
if(map의 value 값이 1이라면)
map에서 삭제
else
map의 value 값을 1 감소
}
}
if(map이 비어있다면)
true 반환
false 반환
}
코드 구현하기
/**
* 131127) 할인_행사
*/
public class L078_131127 {
// want(정현이가 원하는 제품)
// number(정현이가 원하는 제품의 수량)
// discount(XYZ 마트에서 할인하는 제품)
public int solution(String[] want, int[] number, String[] discount) {
// answer(회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수)
int answer = 0;
for (int i = 0; i <= discount.length - 10; i++) {
// 모두 할인 받을 수 있다면
if (isDiscountAble(want, number, discount, i))
// answer 증가
answer++;
}
// answer 반환
return answer;
}
// 모두 할인 받을 수 있는지 함수
private boolean isDiscountAble(String[] want, int[] number, String[] discount, int index) {
// map(제품과 제품의 수량을 저장할 HashMap)
Map<String, Integer> map = new HashMap<>();
// map에 want와 number 저장
for (int i = 0; i < want.length; i++) {
map.put(want[i], number[i]);
}
for (int i = index; i < index + 10; i++) {
// map에 discount[i]가 존재한다면
if (map.containsKey(discount[i])) {
// map의 value 값이 1이라면
if (map.get(discount[i]) == 1)
// map에서 삭제
map.remove(discount[i]);
else
// map의 value 값을 1 감소
map.put(discount[i], map.get(discount[i]) - 1);
}
}
// map이 비어있다면
if (map.isEmpty())
// 모두 할인을 받을 수 있으므로 true 반환
return true;
// false 반환
return false;
}
// 테스트 케이스
public static void main(String[] args) {
L078_131127 solution = new L078_131127();
String[] want = { "banana", "apple", "rice", "pork", "pot" };
int[] number = { 3, 2, 2, 2, 1 };
String[] discount = { "chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice",
"pot", "banana", "apple", "banana" };
int result = solution.solution(want, number, discount);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[131701] 연속 부분 수열 합의 개수 (0) | 2024.02.03 |
---|---|
[131130] 혼자 놀기의 달인 (0) | 2024.02.02 |
[118667] 두 큐 합 같게 만들기 (0) | 2024.02.01 |
[92342] 양궁대회 (0) | 2024.02.01 |
[92341] 주차 요금 계산 (0) | 2024.01.31 |