본문 바로가기
Programming/Programmers

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

by duoxi 2023. 6. 22.

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

 

프로그래머스

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

programmers.co.kr


문제

 


풀이

discount 배열을 10개씩 돌면서 원하는 제품을 모두 구입할 수 있으면 result를 +1 하는 방법을 생각했습니다.

 

want와 number를 Map으로 변환해서, discount를 10개씩 돌면서 개수를 하나씩 빼주고 Map의 value 값이 모두 0 이하가 되면 원하는 것을 전부 구매할 수 있는 것입니다.

 

 

 

1) want와 number를 map의 형태로 바꿈

HashMap<String, Integer> map = new HashMap<>();

for(int m=0; m<number.length; m++){
    map.put(want[m], number[m]);
}

 

 

2) 10일동안 원하는 제품을 얼마나 살 수 있는지 구하기

 

첫 째날부터 원하는 제품을 10일 동안내내 구매할 수 있는 날짜의 수를 구하는 것이기 때문에 총 날짜 수는 discount.length() - 10 + 1 일이 될 것입니다.

예를 들어 15일간 할인 행사를 한다면 (1일째 ~ 10일째), (2일째 ~ 11일째), (3일째 ~ 12일째), (4일째 ~ 13일째), (5일째 ~ 14일째), (6일째 ~ 15일째) 이므로 6일(= 15 - 10 + 1) 입니다.

 

따라서 1일째부터 discount.length() - 10 + 1일째까지 10일 동안의 물건들을 보면 됩니다.

배열의 인덱스이므로 범위는 1을 뺀 0 ~ discount.length() - 10 이 됩니다.

 

discount 배열을 10개씩 돌면서 그 값이 map에 있는지 확인하고, 있다면 value 값을 -1 해줍니다.

 

for(int i=0; i<=discount.length - 10; i++){
    for(int j=0; j<10; j++){
        if(map.containsKey(discount[i+j])){
            map.replace(discount[i+j], map.get(discount[i+j]), map.get(discount[i+j]) - 1);
        }
    }
}

 

 

3) 원하는 제품을 모두 샀는지 확인하기

map의 value 값들이 전부 0 이하가 됐다면 원하는 제품을 모두 구매했다는 뜻이기 때문에 전부 0 이하인지 확인하고 맞다면 answer를 + 1 합니다.

 

boolean isAnswer = true;
for(String key : map.keySet()){
    // 하나라도 0 초과라면 전부 구매 x
    if(map.get(key) > 0){
        isAnswer = false;
    }
}

if(isAnswer) answer ++;

 


소스코드

import java.util.*;

class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        
        for(int i=0; i<=discount.length - 10; i++){
            HashMap<String, Integer> map = new HashMap<>();
            for(int m=0; m<number.length; m++){
                map.put(want[m], number[m]);
            } 
            
            for(int j=0; j<10; j++){
                if(map.containsKey(discount[i+j])){
                    map.replace(discount[i+j], map.get(discount[i+j]), map.get(discount[i+j]) - 1);
                }
            }
            
            boolean isAnswer = true;
            for(String key : map.keySet()){
                if(map.get(key) > 0){
                    isAnswer = false;
                }
            }
            
            if(isAnswer) answer ++;
        }
        
        return answer;
    }
}