boraBong

[Algorithm] Swift 이모티콘 할인 행사 문제 풀이 [프로그래머스 Level2, 2023 KAKAO BLIND RECRUITMENT] 본문

iOS/Algorithm

[Algorithm] Swift 이모티콘 할인 행사 문제 풀이 [프로그래머스 Level2, 2023 KAKAO BLIND RECRUITMENT]

보라봉_ 2023. 1. 27. 19:31
728x90

💬 문제

코딩테스트 연습 - 이모티콘 할인행사


💬 Idea

1. 먼저 이모티콘 수에 맞는 할인율 조합을 구하자

 

💡 어떻게 구할 것인가?→ dfs 재귀함수를 만들어서 할인율(10%, 20%, 30%, 40%) 각각을 돌며 array에 더해주자.

  • 효율성 높이기 - dfs에서 도출되는 불필요한 조합을 줄이자 (꼭 줄이지 않아도 실행결과는 성공합니다!)
    • user가 갖고 있는 가격 기준의 최저값을 구해 sales를 먼저 필터링해주기
    • ex. user = [[40, 10000], [25, 10000]] 의 경우 유저들이 구입할 최저 세일 비율이 30% 이므로
      할인율 중 30%, 40% 만을 갖고 가격 조합을 만들어줄 수 있다. 

2. 할인율 조합을 구한 뒤 해당 조합에서 이모티콘플러스 가입자 수와 판매액이 최댓값인지를 비교하자


💬 풀이

var finalEmtiPlusCnt = 0
var finalSum = 0
var user: [[Int]] = []
var emoticon: [Int] = []

func solution(users:[[Int]], emoticons:[Int]) -> [Int] {
    user = users.sorted(by: { $0[0] > $1[0] })
    emoticon = emoticons
    
    dfs(index: 0, arr: [], max: emoticons.count, sales: [10, 20, 30, 40].filter({ $0 >= user.last![0] }))
    
    return [finalEmtiPlusCnt, finalSum]
}

func dfs(index: Int, arr: [Int], max: Int, sales: [Int]) {
    // 이모티콘의 할인가격 조합인 arr가 emoticon의 개수와 일치할 때
    if index == max {
        // ✅ 해당 할인가격 조합의 이모티콘플러스 가입자 수와 판매액이 최댓값인지 비교
        getResultBySalesComb(arr)
        return
    }
    
    // 재귀함수 호출 - 할인율(10%, 20%, 30%, 40%) 각각을 돌며 arr에 더해준다
    // 이모티콘의 할인가격 조합이 arr에 더해지게됨
    for sale in sales {
        dfs(index: index + 1, arr: arr + [sale], max: max, sales: sales)
    }
}

/// 이모티콘플러스 가입자 수와 판매액 도출 후 최댓값인지 비교하는 메서드
func getResultBySalesComb(_ arr: [Int]) {
    var emtiplusCnt = 0
    var sum = 0
    
    for u in user {
        var userSum = 0
        
        for (index, p) in arr.enumerated() {
            // 유저의 기준비율에 맞는 이모티콘만 선별
            if p >= u[0] {
                userSum += calDiscountPrice(emoticon[index], p)
            }
        }
        
        // 유저의 기준가격을 넘긴다면 이모티콘 플러스 가입
        if userSum >= u[1] {
            emtiplusCnt += 1
        } else {
            // 유저의 기준가격 미만이라면 이모티콘 구매
            sum += userSum
        }
    }
    
    // 현재 할인 비율 모음이 최대 이모티콘 플러스 가입자를 이끌어내는지 확인
    if emtiplusCnt > finalEmtiPlusCnt {
        finalEmtiPlusCnt = emtiplusCnt
        finalSum = sum
    } else if emtiplusCnt == finalEmtiPlusCnt {
        finalSum = sum > finalSum ? sum : finalSum
    }
}

/// 이모티콘 할인 가격 계산 메서드
func calDiscountPrice(_ origin: Int, _ percent: Int) -> Int {
    return origin - ((origin / 100) * percent)
}

 

 

https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%9D%B4%EB%AA%A8%ED%8B%B0%EC%BD%98%20%ED%95%A0%EC%9D%B8%ED%96%89%EC%82%AC.swift

 

GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift

Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.

github.com

 

반응형
Comments