알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

https://school.programmers.co.kr/learn/courses/30/lessons/151141

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔

CAR_RENTAL_COMPANY_CAR : 자동차들의 정보

CAR_RENTAL_COMPANY_RENTAL_HISTORY : 자동차 대여 기록

CAR_RENTAL_COMPANY_DISCOUNT_PLAN : 자동차 종류 별 대여 기간 종류별 할인 정책

 

1. 자동차 종류가 ' 트럭 '

2. 트럭의 대여 금액 기록 ID와 대여 금액 리스트 출력

3. 대여 금액 기준 내림차순, 기록 ID 기춘 내림차순 + FEE는 정수부분만 출력

4. END_DATE - START_DATE 하면 대여기간이 나옴 곱하기 DAILY_FEE를 한 후 그다음에 마지막에 할인율 적용

 

SELECT A.HISTORY_ID
       , DAILY_FEE * (CASE 
            WHEN TO_DATE(END_DATE) - TO_DATE(START_DATE) >= 90 THEN 0.9
            WHEN TO_DATE(END_DATE) - TO_DATE(START_DATE) >= 30 THEN 0.93
            WHEN TO_DATE(END_DATE) - TO_DATE(START_DATE) >= 7 THEN 0.95
            ELSE 1
         END) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID;

 

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 컬럼은 사용하지 않고 , 90 30 7일 이상 배율을 DAILY_FEE로 곱해줬다.

10% 할인이니 0.9를 곱해주면 90%가격이 나오는 것처럼 타입도 트럭 맞고, 정렬 조건도 맞는데 정답이 맞지 않음..

 

SELECT A.HISTORY_ID
       , ROUND(DAILY_FEE * 
         (CASE 
            WHEN DATEDIFF(END_DATE,START_DATE) >= 90 THEN 0.9
            WHEN DATEDIFF(END_DATE,START_DATE) >= 30 THEN 0.93
            WHEN DATEDIFF(END_DATE,START_DATE) >= 7 THEN 0.95
            ELSE 1
         END) *
         (TO_DATE(END_DATE) - TO_DATE(START_DATE) + 1),0) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID DESC;

 

수수료를 곱하고 DATEDIFF와 또 하루 같으면 TO_DATE - TO_DATE 할 경우 + 1을 해줬는데 틀림..

결괏값을 보니 정답하고 ROW 수는 똑같은데 FEE 숫자가 살짝씩 달랐음...

 

 SELECT A.HISTORY_ID
       , ROUND(DAILY_FEE * 
         (CASE 
            WHEN END_DATE - START_DATE + 1 >= 90 THEN 0.85
            WHEN END_DATE - START_DATE + 1 >= 30 THEN 0.92
            WHEN END_DATE - START_DATE + 1 >= 7 THEN 0.95
            ELSE 1
         END) *
         (TO_DATE(END_DATE) - TO_DATE(START_DATE) + 1),0) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID DESC;

이게 정답이였음

 

문제에서는 트럭 할인율이 5%,7%,10% 였음

하나하나 테이블을 조회해봤는데 5%,8%,15%로 나옴

 

테이블을 조인해서 사용하면 하드코딩할 필요가 없어진다. 다시 작성


Solution✍
 SELECT A.HISTORY_ID
       , ROUND(DAILY_FEE * 
         (CASE 
            WHEN END_DATE - START_DATE + 1 >= 90 THEN 0.85
            WHEN END_DATE - START_DATE + 1 >= 30 THEN 0.92
            WHEN END_DATE - START_DATE + 1 >= 7 THEN 0.95
            ELSE 1
         END) *
         (TO_DATE(END_DATE) - TO_DATE(START_DATE) + 1),0) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID DESC;
SELECT S1.HISTORY_ID
        , ROUND((DAILY_FEE - (DAILY_FEE * (NVL(DISCOUNT_RATE,0)/100))),0) * DURATION AS FEE
    FROM
       (
       SELECT A.CAR_ID
              , DAILY_FEE
              , END_DATE - START_DATE + 1 AS DURATION
              , B.HISTORY_ID
              , CASE WHEN END_DATE - START_DATE >= 90
                    THEN '90일 이상'
                    WHEN END_DATE - START_DATE >= 30
                    THEN '30일 이상'
                    WHEN END_DATE - START_DATE >= 7
                    THEN '7일 이상'
                    ELSE '7일 미만'
                END AS DURATION_TYPE
       FROM CAR_RENTAL_COMPANY_CAR A JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
         ON A.CAR_ID = B.CAR_ID
      WHERE A.CAR_TYPE = '트럭') S1
      
     LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN C
         ON S1.DURATION_TYPE = C.DURATION_TYPE
        AND C.CAR_TYPE = '트럭'
        ORDER BY FEE DESC , HISTORY_ID DESC;

서브쿼리에서 조인 DURATION_TYPE 과의 조인 조건을 만들어내서 조인을 함.


Review🤩

생각보다 어렵다 ... 2일 걸림


 

+ Recent posts