♟️ 알고리즘/알고리즘_프로그래머스

[MySQL][프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 / (Lv4)

Jerry_K 2025. 2. 21. 23:45

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


🗒️SQL 코드 풀이 

# 자동차 종류 : 세단 or SUV / 2022년 11월 1일 ~ 11월 30일 / 대여 금액 50만원 ~ 200만원 
# 자동차 ID / 자동차 종류 / 대여 금액 
# 대여 금액(FEE) 기준 내림차순 정렬 /  자동차 종류 오름차순 / 자동차 ID 내림차순

SELECT
    C.CAR_ID,
    C.CAR_TYPE,
    ROUND(DAILY_FEE*30*((100-D_P.DISCOUNT_RATE)/100),0) FEE
    FROM CAR_RENTAL_COMPANY_CAR  C
    LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY R_H
    ON C.CAR_ID = R_H.CAR_ID
    LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN  D_P
    ON C.CAR_TYPE = D_P.CAR_TYPE
    WHERE 
        C.CAR_ID NOT IN 
        (
        	SELECT CAR_ID
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
                WHERE END_DATE >= "2022-11-01" AND START_DATE <= "2022-11-30"
        )
        AND
        (C.CAR_TYPE = "세단" OR C.CAR_TYPE = "SUV" )
        AND 
        D_P.DURATION_TYPE = "30일 이상" 
        AND 
        ROUND(DAILY_FEE*30*((100-D_P.DISCOUNT_RATE)/100),0) > 500000
        AND 
        ROUND(DAILY_FEE*30*((100-D_P.DISCOUNT_RATE)/100),0) < 2000000
    GROUP BY C.CAR_ID
    ORDER BY
        FEE DESC, C.CAR_TYPE, C.CAR_ID DESC

 

1. 조건에 맞게 하나 하나 해결하면 된다 . 

 

2. 맨 처음에 CAR_RENTAL_COMPANY_RENTAL_HISTORY, CAR_RENTAL_COMPANY_DISCOUNT_PLAN을 CAR_RENTAL_COMPANY_CAR를 기준으로 LEFT JOIN을 생각한다. 

 

3. 이후 조건에 맞게 해결하면 되는데, 날짜 필터링 부분을 주의하자. 

우리가 원하는 것은 2022년 11월 1일 ~ 11월 30일이 포함되지 않도록 하는 것이다. 

 

4. 해당 조건에 맞게 하기위해  WHERE 절에 서브쿼리와 NOT IN을 사용해서 한다.

  • NOT IN 이기 때문에, 반대로 2022년 11월 1일 ~ 11월 30일 범위를 SELECT
  • END_DATE를 "2020-11-01"  로 설정하면 "2020-11-01"이 최소이자 시작점이 됨
  • 그리고 START_DATE를 "2020-11-30" 까지 설정 하면 끝

 

 

📌 문제 코멘트 

(R_H.START_DATE < "2022-11-01" OR R_H.START_DATE > "2022-12-01")
AND
(R_H.END_DATE < "2022-11-01" OR R_H.END_DATE >= "2022-12-01")

 

맨 처음에 이런식의 조건을 해서 계속 실패를 했다 .

 

C.CAR_ID NOT IN 
    (
        SELECT CAR_ID
            FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
            WHERE END_DATE >= "2022-11-01" AND START_DATE <= "2022-11-30"
    )

 

이런식의 방법이 더 편하고 효과적인 것 같으니 기억해주자. 

 

 

해당 문제에서 꼭 기억하면 좋은 것들

  • NOT IN 문법을 알아두자
  • GROUP BY를 쓰면 SELECT * 을 할 수 없음
  • 조건문에서도 저런식으로 서브 쿼리 사용이 가능함

📚문제