일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- CORS
- webpack
- dfs
- 무한 스크롤
- TS
- recoil
- SSR
- map
- 리터럴 타입
- ESlint
- Cypress
- async/await
- useAppDispatch
- 타입 좁히기
- 투포인터
- 반공변성
- autosize
- Promise
- React
- 인터섹션
- 공변성
- CI/CD
- tailwind
- 이분 검색
- Jest
- 태그된 유니온
- 결정 알고리즘
- 호이스팅
- app router
- RTK Query
Archives
- Today
- Total
짧은코딩
프로그래머스) 이모티콘 할인행사 본문
반응형
-문제 사이트
https://school.programmers.co.kr/learn/courses/30/lessons/150368
코드
function solution(users, emoticons) {
let count = 0,
money = 0;
let allCase = [];
let disCount = [10, 20, 30, 40];
// 모든 경우의 수를 구해주는 DFS
function DFS(emotions, case1) {
if (emotions.length < 1) {
allCase.push(case1);
return;
}
for (let i = 0; i < 4; i++) {
DFS(emotions.slice(1), [...case1, [disCount[i], emotions[0]]]);
}
}
DFS(emoticons, []);
// 할인된 가격 구해주는 함수
const disCountPrice = (per, price) => ((100 - per) / 100) * price;
// way는 한 가지 경우의 수
allCase.forEach((way) => {
let tempC = 0,
tempM = 0;
users.forEach((user) => {
let price = 0;
way.forEach((info) => {
if (user[0] <= info[0]) price += disCountPrice(info[0], info[1]);
});
if (price >= user[1]) tempC++;
else tempM += price;
});
if (count < tempC) {
count = tempC;
money = tempM;
} else if (count === tempC) {
money = Math.max(money, tempM);
}
});
return [count, money];
}
풀이 방법
이 문제는 처음에 for문을 최대한 사용하지 않을 생각에 막막했지만 의외로 그냥 단순하게 풀면되는 문제이다.
function DFS(emotions, case1) {
if (emotions.length < 1) {
allCase.push(case1);
return;
}
for (let i = 0; i < 4; i++) {
DFS(emotions.slice(1), [...case1, [disCount[i], emotions[0]]]);
}
}
DFS(emoticons, []);
DFS 함수를 이용해서 이모티콘 할인율에 대한 모든 경우의 수를 구하고 allCase에 저장한다. allCase에는 위 사진처럼 저장된다.
// 할인된 가격 구해주는 함수
const disCountPrice = (per, price) => ((100 - per) / 100) * price;
// way는 한 가지 경우의 수
allCase.forEach((way) => {
let tempC = 0,
tempM = 0;
users.forEach((user) => {
let price = 0;
way.forEach((info) => {
if (user[0] <= info[0]) price += disCountPrice(info[0], info[1]);
});
if (price >= user[1]) tempC++;
else tempM += price;
});
if (count < tempC) {
count = tempC;
money = tempM;
} else if (count === tempC) {
money = Math.max(money, tempM);
}
});
allCase에 저장된 모든 경우의 수를 순회한다. 그리고 각 user에 대한 모든 할인값을 구하고 플러스 서비스 가입여부를 판단한다. 이를 tempC, tempM에 저장하고 최종 반환하는 count와 money와 비교 후 값을 최신화시킨다.
반응형
'코딩테스트 with JS > 백준, 프로그래머스' 카테고리의 다른 글
프로그래머스) 순위 검색(조합, 이진 탐색, Map vs Object) (1) | 2023.02.23 |
---|---|
프로그래머스) 택배 배달과 수거하기 (0) | 2023.02.09 |
프로그래머스) 개인정보 수집 유효기간 JS (0) | 2023.01.19 |
프로그래머스) 양궁대회 JS (0) | 2023.01.15 |
프로그래머스) k진수에서 소수 개수 구하기 JS (1) | 2023.01.06 |
Comments