본문 바로가기
개인 공부/알고리즘

[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 풀이

by 킴도비 2023. 2. 2.

오늘 문제 이해부터 헷갈렸던 프로그래머스 문제 까먹기 전에 블로그에 적으려고 오랜만에 작성해본다.

 

 이거 푸는데 거의 2시간쯤 걸린 것 같다. 왜냐하면 1시간은 문제를 잘못 이해하고 잘못 풀어서 시간 통으로 날렸기 때문에.. 😂 그래도 값진 경험이었다. 친구의 찰떡같은 설명 + 프로그래머스의 질문하기에 있는 해설을 보고 도움을 엄청 많이 받았다!

 

📔 해당 문제 링크

 

프로그래머스

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

programmers.co.kr

 

📖 문제 내용

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: 
RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

 

  • 해당하는 테이블

CAR_RENTAL_COMPANY_RENTAL_HISTORY

 

🔍 문제에서 이해하면 좋은 내용

  • 2022년 8월부터 2022년 10월까지총 대여 횟수가 5회 이상이어야 한다.
  • 출력해야하는 것MONTH, CAR_ID, RECORDS 이다.
  • 정렬 기준월(오름차순), 자동차 ID(내림차순) 이다.

 

 위 3가지가 정말 중요한데 특히 맨 첫 문장이 정말로 정말로 중요했다. 왜냐하면 저 8월부터 10월까지라는 말이 8월~10월 사이의 해당하는 차가 모든 월의 총 COUNT 수가 5 이상인 것을 찾아야 하는 문제이기 때문이었다. 

예시로 CAR_ID가 3인 차가 있다.

이 차는 8월에 2회, 9월에 1회, 10월에 3회를 차를 대여하였다. 그러면 8월 + 9월 + 10월의 총 횟수가 6이므로 5회보다 많으니 조건에 맞다.

그러므로 해당 월 - 차 아이디 - 총 횟수로 출력이 되야 하는 문제인 것이다.
아래 처럼 나와야 한다.
M | C_I | C 
08 | 3 | 2
08 | 1 | 4
09 | 3 | 1
10 | 3 | 3

 

 자세히 안 읽어보고 그냥 8월따로 9월따로 10월 따로 횟수가 5회 이상인 줄 알았던 나는.. 그렇게 1시간을 다르게 풀고 있었다..

 

✅ 정답 소스 코드

-- 코드를 입력하세요
-- 문제의 핵심은 2022년 8월 ~ 2022년 10월까지 <총> 대여 횟수가 5회 이상
-- 출력해야 하는 것 : MONTH, CAR_ID, RECORDS
-- 정렬 기준 : 월(오름차순), 자동차 ID(내림차순)
SELECT DATE_FORMAT(START_DATE, '%m') AS 'MONTH', CAR_ID, COUNT(*) AS 'RECORDS'
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (SELECT CAR_ID
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                WHERE MONTH(START_DATE) BETWEEN 08 AND 10
                 GROUP BY CAR_ID
                 HAVING COUNT(*) >= 5
                )
GROUP BY MONTH, CAR_ID
HAVING MONTH BETWEEN 8 AND 10
ORDER BY MONTH ASC, CAR_ID DESC;

 

 

여기서 들었던 의문

 WHERE에서 CAR_ID를 추출하였는데 서브 쿼리에서 이미 8월부터 10월까지의 아이디를 추출했는데 왜 조건으로 또 8월에서 10월까지를 해주었는지에 대해서 친구와 함께 의문이 정말 많았다. 이미 해줬는데 굳이 또 왜 해주어야 정답이지???? 라는 질문...

 

그 이유는 친구 피셜 + 질문하기에 있었던 글이었는데

  1. 서브 쿼리에서 가져오는 CAR_ID는 해당 조건에 맞는 CAR_ID를 가져온다.
  2. 하지만 메인으로 넘어오면서 원래 데이터에 있던 이전 달에 대한 정보도 가져온다. (8월에서 10월까지가 아닌 6월, 7월)
  3. 그렇기 때문에 한 번 더 8월에서 10월이라고 조건을 넣어줘야만 정답으로 처리된다.

(feat. 더 자세하고 정확한 설명이 있으시다면 꼭 댓글에 달아주시면 큰 도움이 될 것 같습니다 ❤)

 

 

또한 나는 개인적으로 헷갈렸었던 게 having에 count 넣는 것이었다.

 

 사실 계속 에러 나가지고 ㅋㅋㅋ 원래는 count(history_id)를 넣었었는데 count(*)로 바꾸니 에러가 덜 났었다. 그래서 select도 그냥 count(*)로 바꾸었다.

 

 

어찌되었든 오늘 안에 풀어서 뿌듯하고 친구와 함께 이것저것 이 문제에 대해서 얘기하니 즐거웠다 😊