우당탕탕 개발일지

[프로그래머스] 할인행사(Java, Level.2) 본문

코테/프로그래머스

[프로그래머스] 할인행사(Java, Level.2)

ujin302 2024. 6. 25. 10:59
반응형

문제

1. 10일 동안 회원 자격 부여

2. 회원을 대상으로 매일 1가지 제품 할인 

3. 할인하는 제품은 1일 1개 구매 가능 

4. 회원 자격 동안 원하는 제품과 수량을 모두 구매하여야 함.

 

 

예를 들어, 정현이가 원하는 제품이 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개이며, XYZ 마트에서 14일간 회원을 대상으로 할인하는 제품이 날짜 순서대로 치킨, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나인 경우에 대해 알아봅시다. 첫째 날부터 열흘 간에는 냄비가 할인하지 않기 때문에 첫째 날에는 회원가입을 하지 않습니다. 둘째 날부터 열흘 간에는 바나나를 원하는 만큼 할인구매할 수 없기 때문에 둘째 날에도 회원가입을 하지 않습니다. 셋째 날, 넷째 날, 다섯째 날부터 각각 열흘은 원하는 제품과 수량이 일치하기 때문에 셋 중 하루에 회원가입을 하려 합니다.

문자열 배열 want  : 정현이가 원하는 제품

정수 배열 number : 정현이가 원하는 제품의 수량

문자열 배열 discount  : XYZ 마트에서 할인하는 제품

 

회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return 하는 solution 함수를 완성하시오. 가능한 날이 없으면 0을 return 합니다.

 

 

입출력 예

 

 

풀이

나는 해당 문제를 조건에 만족하는 가장 빠른 날을 구하는 줄 알았으나... 만족하는 총 일수를 구하는거였다..

(문제 대충 읽음.....) 

이 부분을 주의하면서 문제풀기...! 

 

 

1. 변수 설명

 

dis_Idx는 현재 날짜를 의미하기에 해당 변수를 사용하여 문제의 조건에 만족하는 총 일수를 구할거임. 

 

2. While문

1. while문의 조건 

남은 날짜가 10일(회원기간)을 넘은 경우에만 작업해야 함. 

 

2. 1번째 for문

HashMap에 10일 간의 할인 품목과 개수 저장

 

3. 2번째 for문

할인 품목의 개수가 사용자가 구매하고 싶은 개수보다 많은지 확인 

만약 적다면 구매할 수 없음으로 판단하여 break로 나가기 

 

4. if문

원하는 제품을 모두 할인을 받았다면 결과값 + 1 

그렇지 않다면 다음날부터 10일 간 다시 확인 

 

코드 

import java.util.*;
 
public int s4(String[] want, int[] number, String[] discount) {
        System.out.println("할인 행사");
        int answer = 0;

        int wantLen = want.length; // 항목 개수
        int discountLen = discount.length; // 닐짜별 세일하는 항목
        int dis_Idx = 0; // discount 인덱스 번호 & 날짜

        while (discountLen - dis_Idx >= 10) {
            // 1. 남은 날짜가 10일을 넘은 경우에만 실행
            Boolean isNotCorrect = false; // 원하는 제품을 모두 할인 받을 수 없으면 true

            // 2. 10일 간 할인 품목 설정
            HashMap<String, Integer> tenDayMap = new HashMap<>(); // 10일 간 할인하는 항목과 개수
            for (int i = 0; i < 10; i++) {
                String key = discount[dis_Idx + i];
                tenDayMap.put(key, tenDayMap.getOrDefault(key, 0) + 1);
            }

            for (int i = 0; i < wantLen; i++) {
                int getMap = tenDayMap.getOrDefault(want[i], 0);
                if (getMap < number[i]) {
                    // 할인 개수 < 구매하고 싶은 개수
                    isNotCorrect = true;
                    break;
                }
            }

            // 3. 원하는 제품을 모두 할인 확인
            if (!isNotCorrect) {
                answer++;
            }
            dis_Idx++;
        }

        return answer;
    }

 

 

프로그래머스 문제

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

 

프로그래머스

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

programmers.co.kr

 

반응형