본문 바로가기

알고리즘(w.KOTLIN)/탐색

[알고리즘][KOTLIN] 할인 행사

728x90

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

1. 구매할 목록을 wantMap 에 저장한다.

2. discount 크기까지 매일 날짜가 바뀌는 것 간주하고 탐색 한다.

3. 구매할 물품의 목록(wantMap) 이 날짜가 변경되면 초기 저장값으로 되어야 하므로 또 다른 map 을 선언하여 copy 하여 사용한다.

4. 시작 날짜(i) 부터 10일간 탐색한다. 단, 탐색 index 가 discount 크기와 같을 경우 탐색을 종료한다.

5. 4번 과정 완료 후 map 의 값 중에 양수가 있으면 구매를 다 못했다는 의미이므로 구매를 완료했는 지 여부를 확인하는 result 를 false 로 업데이트 한다.

6. result 가 true 일 경우 구매를 완료 했으므로 answer 값을 증가 한다.

코드

class Solution {
    fun solution(want: Array<String>, number: IntArray, discount: Array<String>): Int {
        var answer: Int = 0
        
        // 구매할 목록을 Map 에 저장한다.
        val wantMap = mutableMapOf<String, Int>()

        for (i in 0 until want.size) {
            wantMap[want[i]] = number[i]
        }
        
        // discount 크기까지 매일 날짜가 바뀌는 것으로 탐색 한다.
        for (i in 0 until discount.size) {
            //println("wantMap >>> $wantMap")
            
            // 구매할 물품의 목록(wantMap) 이 날짜가 변경되면
            // 초기 저장값으로 되어야 하므로 또 다르 map 을 선언하여 copy 하여 사용한다.
            val map = mutableMapOf<String, Int>()
            map.putAll(wantMap)
            
            //println("map >>> $map")
            
            // 시작 날짜(i) 부터 10일간 탐색한다.
            // 단 탐색 index 가 discount 크기와 같을 경우 탐색을 종료한다.
            for (j in i until (i + 10)) {
                if (j == discount.size) break
                
                map[discount[j]]?.let { m ->
                    if (map.containsKey(discount[j])) {
                        map[discount[j]] = m - 1
                    }
                }
            }
            
            //println("map >>> $map")
            
            var result = true

            // map 의 값 중에 양수가 있으면 구매를 다 못했다는 의미이므로
            // 구매를 완료했는 지 여부를 확인하는 result 를 false 로 업데이트 한다.
            map.values.forEach { v ->
                if (v > 0) result = false
            }
            
            // result 가 true 일 경우 answer 값을 증가 한다.
            if (result) answer++
        }
        
        return answer
    }
}
728x90