🔥문제
https://school.programmers.co.kr/learn/courses/30/lessons/150368
🔥풀이
일단 주어진 조건을 보면 emoticon의 갯수는 최대 7개 정도이고 할인율은 4가지 종류이다. 따라서 이모티콘이 가질 수 할인율 가지수는 최대 4**7 정도이므로 각각의 경우를 모두 개산하는 방식으로 접근해도 무리없다고 판단하였다.
일단 calculator 함수는 유저정보(user_arr)와 이모티콘들의 가격과 할인율을 담은 2차원 배열(emoticons_arr)을 매개변수로 주어졌을 때 우리가 원하는 [가입자수,이모티콘 구매금액] 을 return 하는 함수를 정의하였다. (나중에 이용)
이모티콘들이 가질 수 있는 모든 할인율의 경우를 재귀함수(recursive)를 통해 설정하고 calculator 함수를 통해 주어진 각각의 경우에서 [가입자수, 이모티콘 구매금액을] 도출하여 이를 배열에 넣었고 마지막에 sort를 통해 정렬한뒤 가장 가입자수가 많고 구매금액이 많은 경우를 구했다. ( 사실 array에 push 하고 마지막에 소팅하지 않아도 된다. 그냥 바로바로 비교하여 답을 계속 갱신하는 방법을 이용하면 ... )
function solution(users, emoticons) {
// [ [이모티콘 가격, 이모티콘 할인율], ... ] 형태의 배열 생성 ( 추후 이용하기 위해 )
// 이모티콘 할인율은 추후 결정되므로 undefined로 세팅
let converted_emoticons = emoticons.map((price)=>[price,undefined])
// user_arr => [[최소할인율,이모티콘최대구매금액], ...] 형태의 배열
// emoticons_arr=> 이모티콘의 할인율과 가격을 담은 이차원 배열
// 위 2개의 매개변수주어졌을 때 [이모티콘 플러스 가입자, 이모티콘 구매금액] 을 return 하는 함수
const calculator=(user_arr,emoticons_arr)=>{
let result =[0,0]
for(const user of user_arr){
let [min_percent,limit]=user
let total_price = 0
emoticons_arr.forEach(([price,sale_percent])=>{
if(min_percent<=sale_percent){
total_price+=price*(100-sale_percent)*0.01
}
})
if(total_price>=limit){
result[0]+=1
}else{
result[1]+=total_price
}
}
return result
}
const answer_arr = []
const recursive=(set_index,arr)=>{
if(set_index===emoticons.length){
// 이때 [가입자수, 이모티콘 매출액] 을 도출하여 answer_arr에 push
answer_arr.push(calculator(users,arr))
return
}
[10,20,30,40].forEach((sales_percent)=>{
let copied = arr.map((item)=>{ return [...item]})
copied[set_index][1]=sales_percent
recursive(set_index+1,copied)
})
}
recursive(0,converted_emoticons)
// 정렬 ( 구독자수 최대, 구매금액 최대 인순으로 )
answer_arr.sort((a,b)=>{
if(b[0]===a[0]) return b[1]-a[1]
return b[0]-a[0]
})
return answer_arr[0]
}
🔥후기
문제를 풀면서 사소한 실수가 있었는 데 이것 때문에 좀 시간을 소모했다. 바로 할인율이다.
30% 할인일 경우 당연히
할인된 가격은 = 기본가격 * (100-할인율) * 0.01 이렇게 해야되는데
할인된 가격 = 기본가격 * 할인율 * 0.01 이렇게 기재해버렸다 -_- 그래놓고 한참을 왜 계산이 틀리지 해맸는데... 다음부터는 이런 잔 실수는 하지 않는게 좋겠다.
'알고리즘' 카테고리의 다른 글
프로그래머스[JS] > 리코쳇 로봇 (0) | 2024.08.25 |
---|---|
프로그래머스[JS] > 괄호 변환 ( 2020 KAKAO BLIND RECRUITMENT ) (0) | 2024.08.24 |
프로그래머스[JS] > 단어변환 (0) | 2024.08.24 |
프로그래머스[JS] > 순위 (0) | 2024.08.15 |
프로그래머스[JS] > 무인도 여행 (0) | 2024.08.11 |