문제
https://school.programmers.co.kr/learn/courses/30/lessons/150368?language=kotlin
문제 풀이
문제가 굉장히 길고 복잡해 보이지만 문제에서 원하는 것은 간단합니다.
이모티콘에 대한 할인율을 10,20,30,40중 적절하게 적용해서
- 가장 많은 이모티콘 서비스 구독자를 확보.
- 구독자가 동일하다면 가장 많은 판매액을 확보
따라서 우리는 이모티콘에 대해서 확률을 모든 경우의 수에 대해 적용해 보고 위의 조건들을 검사해 주면 됩니다.
이모티콘에 대한 모든 확률을 대입하는것은 재귀함수를 dfs를 통해서 구현했습니다.
모든 이모티콘에 대한 확률을 대입했다면 이모티콘과 확률을 이용해서 계산을 해야 합니다.
유저에 대해서 유저의 세일 기준보다 같거나 높은 이모티콘들에 대해서만 가격을 더해줍니다.
여기서 가격이 만약 유저의 가격 기준보다 같거나 크다면 이모티콘 서비스를 구독하고, 아니라면 총금액에 더해줍니다.
이러한 과정을 모든 유저에 대해서 한 뒤, 저장된 결과들을 반환해 줍니다.
이러한 반환된 결과와 이전까지의 최선의 선택지(이모티콘 구독자수, 판매금액)와 비교해 줍니다.
- 구독자수가 같다면 판매금액을 비교
함수 설명
- getUser() -> 입력받은 user들을 data class user로 바꿔서 저장함.
- salesEmoticons() -> 이모티콘에 대한 모든 할인률 경우의 수를 대입함.
- calculatePrice() -> 이모티콘에 해당하는 확률을 이용해서 구독자와 판매금액을 계산함.
전체 코드
class Solution {
lateinit var userList : ArrayList<User>
lateinit var percent : Array<Pair<Int,Int>>
var result = Pair(0,0)
val salesAmount = listOf(10,20,30,40)
fun solution(users: Array<IntArray>, emoticons: IntArray): IntArray {
userList= getUser(users)
percent = Array(emoticons.size){Pair(0,0)}
salesEmoticons(emoticons,0)
var answer: IntArray = intArrayOf(0,0)
answer[0]=result.first
answer[1]=result.second
return answer
}
fun calculatePrice() : Pair<Int,Int>{
var subscribe=0
var totalPrice=0
for(user in userList){
var sum=0
val buy = percent.filter{it.second>=user.sales} //유저의 할인기준 이상인 것을 찾음.
if(buy.size==0) continue
for(emoticon in buy){
sum+=(emoticon.first*(100-emoticon.second))/100
}
if(sum>=user.limit){
subscribe++
} else {
totalPrice+=sum
}
}
return Pair(subscribe,totalPrice)
}
fun salesEmoticons(emoticons : IntArray,depth : Int){
if(depth==emoticons.size){ //끝까지 갔을때 판매금액을 구한다.
val temp = calculatePrice()
if(temp.first>result.first){
result=temp
return
}
if(result.first==temp.first && result.second<temp.second){
result=temp
return
}
return
}
for(sale in salesAmount){
percent[depth]=Pair(emoticons[depth],sale)
salesEmoticons(emoticons,depth+1)
percent[depth]=Pair(emoticons[depth],0)
}
}
fun getUser(users:Array<IntArray>) : ArrayList<User>{
val list : ArrayList<User> = arrayListOf()
for(row in users){
list.add(User(row[0],row[1]))
}
return list
}
data class User(val sales : Int, val limit : Int)
}
'CodingTest > Programmers' 카테고리의 다른 글
프로그래머스[programmers] - 불량사용자(Kotlin)[LV3] (0) | 2023.10.29 |
---|---|
프로그래머스[programmers] - N-Queen(Kotlin)[LV2] (0) | 2023.10.25 |
프로그래머스[programmers] - 양궁대회(Kotlin)[LV2] (2) | 2023.10.23 |
프로그래머스[programmers] - 합승 택시 요금(Kotlin)[LV3] (1) | 2023.10.19 |
프로그래머스[programmers] - N으로 표현(Kotlin)[LV2] (1) | 2023.10.06 |