| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 29 | 30 | 31 | 
													Tags
													
											
												
												- webpack
- ESlint
- 인증/인가
- CORS
- 태그된 유니온
- 타입 좁히기
- async/await
- 무한 스크롤
- 공변성
- 인터섹션
- 호이스팅
- Promise
- map
- useAppDispatch
- app router
- TS
- dfs
- SSR
- MSA
- recoil
- tailwind
- RTK Query
- 투포인터
- 반공변성
- 리터럴 타입
- React
- Jest
- autosize
- CI/CD
- 결정 알고리즘
													Archives
													
											
												
												- Today
- Total
짧은코딩
프로그래머스) 이모티콘 할인행사 본문
반응형
    
    
    
  -문제 사이트
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
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