코딩테스트/SQL

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

_알파카 2024. 8. 5. 11:49
728x90

문제 설명

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

 

프로그래머스

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

programmers.co.kr

 

내 풀이

틀린 풀이

SELECT CAR_ID,
    CASE WHEN (END_DATE >= '2022-10-16' AND START_DATE < '2022-10-16') THEN '대여중'
        ELSE '대여 가능'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

처음에는 위와 같이 풀었다. 

하나의 CAR_ID에 대하여 대여 기록이 여러개 있으므로, GROUP BY를 통해 그룹화를 해주었는데, 

사실 풀면서도 뭔가 그룹화에 대한 조건이 필요할듯 했는데, 

대여 기록을 기준으로 하기에도 애매하고, 뭔가 다 애매해서 단순하게 위와 같이 작성하였고, 

역시 틀렸다ㅠㅠ

 

맞은 풀이

SELECT CAR_ID,
    CASE 
        WHEN CAR_ID IN (
            SELECT CAR_ID
            FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
            WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE
        ) THEN '대여중'
        ELSE '대여 가능'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

틀린 이유 1) 하나의 자동차 ID에 대하여 여러 개의 대여 기록이 있다. 

이를 확인해보면, 2022-10-16에 대여중인 기록이 잡히지만,

그 기간이 아닌 날에는 대여 가능으로 뜬다.

즉, 하나의 자동차 ID에 대하여 대여 가능과 대여중이 모두 뜨는 것이다. 

이를 고려하지 않고 그냥 나타내게 되면, 제대로 처리가 되지 않을 가능성이 있다. 

 

따라서, SELECT 절에서 서브쿼리를 이용해 2022-10-16에 "대여중"에 해당하는 자동자 ID는 모두 "대여중"으로 바꿔주면 해결이 된다. 

 

 

틀린 이유 2)

# 1
END_DATE >= '2022-10-16' AND START_DATE < '2022-10-16'

# 2
END_DATE >= '2022-10-16' AND START_DATE <= '2022-10-16'
'2022-10-16' BETWEEN START_DATE AND END_DATE

 

첫 번째 방법은 내가 작성했던 방법이다. 그러나 문제에서 2022년 10월 16일 경우에도 "대여중"으로 표시하라고 했으므로, 

두 번째 방법과 같이 작성해줘야 한다. 

참고로, BETWEEN 함수의 경우 양 끝 값이 포함되며, A 이상 B 이하인 범위를 나타낸다! 

 

728x90