본문 바로가기
공부 일지/문제풀이

[프로그래머스] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기(MySQL)

by Joshbla 2023. 11. 17.

코딩 테스트 연습 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/157340

 

프로그래머스

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

programmers.co.kr

문제 설명


문제 풀이

생각 과정

그전에 풀었던 연습문제에 비해서 난이도가 확 올라갔다...

우선 원하는 결과 CAR_ID

SELECT CAR_ID,

그리고 기간에 10월 16일이 포함되어있는지 확인하는 AVAILABILITY

-> IF, BETWEEN AND, AS 사용

SELECT CAR_ID, 
IF(DATE('2022-10-16') BETWEEN START_DATE AND END_DATE ,"대여중", "대여 가능" )AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

그리고 차 번호로 중복제거하고 정렬하면

SELECT CAR_ID, 
IF(DATE('2022-10-16') BETWEEN START_DATE AND END_DATE ,"대여중", "대여 가능" )AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

오답이 나온다.

 

원인을 찾아보니 GROUP BY로 묶을 때 AVAILABILITY에 상관 없이 그룹화하기 때문에 

이런 경우에서 대여 가능이라고 표시가 되버린다.

 

구현

결국 다른사람들의 풀이를 참고했다.

 

내가 작성했던 코드에서 조금만 수정하면된다.

->IN 을 사용하여 10월 16일에 대여중인 경우에는 해당 CAR_ID의  AVAILABILITY를

모두 "대여중"으로 한다.

SELECT CAR_ID,  
    IF( CAR_ID IN
       (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
        WHERE DATE('2022-10-16') BETWEEN START_DATE AND END_DATE ),
       "대여중", "대여 가능" )
   AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;