알고리즘

프로그래머스 - 할인 행사

최데브 2024. 8. 27. 13:53

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

 

프로그래머스

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

programmers.co.kr

 

성능이 좋은 코드는 아닌것 같지만 ..

우선 map 을 이용해서 행사 상품 이름과 사려는 갯수를 넣었다.

 

그리고 10개씩 상품과 사려는 갯수가 할인품목과 일치해야하기 때문에 left 와 right 를 10 이 차이나게 한 상태로 이동 시키

고  위 범위를 이용하여 만들어낸 배열에서 map 에 저장된 key의 품목이 있는지 체크하고 있다면 갯수를 -1 해준다.

 

이렇게 진행하면서 map 의 모든 key 의 value 가 0 이하가 되면 모든 물건을 할인된 상태로 구입 했다는 뜻이고

즉, 가입을 할 수 있는 날이 되는 것이니  answer 의 값을 증가시켜준다.

 

그리고 다음날로 옮겨서 또 10개의 사이즈로 배열을 뽑아내고 비교를 반복한다.

그렇게 해서 right 가 할인품목 리스트의 마지막에 닿으면 종료하면 된다.

 

그럼 최종적으로 조건을 만족하는 가입 날짜의 갯수가 나온다.

 

class Solution {
    fun solution(want: Array<String>, number: IntArray, discount: Array<String>): Int {
        var answer: Int = 0
        var map = HashMap<String,Int>()
        
        for(i in 0 until want.size){
            map.put(want[i], number[i])
        }

        var left = 0
        var right = 10
        while(right <= discount.size){
            var tempMap = map.toMutableMap()
            discount.copyOfRange(left,right).forEach{ item->
                tempMap.get(item)?.let{
                    tempMap.put(item, it-1)
                }
            }
            if(tempMap.values.all { it <= 0 }){
                answer++
            }
            left++
            right++
        }
        
        return answer
    }
}

 

반응형