-
프로그래머스 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 [MySQL]문제 풀이/프로그래머스 2023. 8. 1. 00:46반응형
이 문제는 SQL 고득점 kit에서 join 카테고리에 있는 level 4 문제이다. 어려운 SQL 문제를 풀면서 느끼는 건 처음부터 요구사항을 모두 만족하는 쿼리를 짜려고 하면 문제가 더욱 어렵게 느껴진다는 것이다. 복잡한 join 문제를 풀때는 우선 하나의 테이블 당 요구 조건을 만족하는 단일 쿼리를 짜보고, 그 다음에는 두개의 테이블을 join하는 쿼리를 짜고, 그 다음의 요구사항을 맞추는 방식으로 풀면 결국 풀리게 된다.
이 문제를 처음 제출할 때에는 틀렸습니다가 나왔는데, 아무리 생각해도 논리 구조가 맞아서 혹시 날짜 범위에 문제가 있나 싶어 수정하니 바로 정답이 나왔다. 처음에는 start_date와 end_date가 11월 1일과 11월 30일 사이인 걸 not in 안의 서브쿼리로 넣었는데, 이렇게 하면 더 큰 범위로 11월 1일과 11월 30일에 예약이 되어있는 history를 잡지 못한다. 그걸 캐치하면 생각보다 쉽게 풀수 있는 문제였다.
SELECT CAR_ID, C.CAR_TYPE, ROUND(DAILY_FEE * (1 - DISCOUNT_RATE / 100) * 30, 0) AS FEE FROM CAR_RENTAL_COMPANY_CAR AS C INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS H ON C.CAR_TYPE = H.CAR_TYPE WHERE (C.CAR_TYPE = '세단' OR C.CAR_TYPE = 'SUV') AND DURATION_TYPE = '30일 이상' AND 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') HAVING FEE >= 500000 AND FEE < 2000000 ORDER BY FEE DESC, C.CAR_TYPE ASC, CAR_ID DESC ;
반응형'문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 기지국 설치 [C++] (0) 2023.08.14 프로그래머스 - 숫자 게임 [C++] (0) 2023.08.14 프로그래머스 - 디스크 컨트롤러 [C++] (0) 2023.07.26 프로그래머스 - 자동차 대여 기록에서 장기/단기 대여 구분하기 - 151138 [MySQL] (0) 2023.07.18 프로그래머스 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 [MySQL] (0) 2023.06.23