CAR_ID가 테이블에서 중복으로 나타남. 총 횟수가 5회 이상인 것만 고르는 것이 문제의 요구 조건 => 서브쿼리가 필요
✅WHERE절에 분석 대상 기간 지정 및 서브쿼리로 ‘대여 5회 이상 자동차’ 선정
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
AND CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
)
해당 조건에 대한 서브쿼리를 작성하는 게 포인트였던 것 같다.
| 단계 | 설명 |
|---|---|
| 1 | 8~10월로 범위 필터링 |
| 2 | 5회 이상 대여된 자동차 ID만 추림 (서브쿼리) |
| 3 | 월별로 그룹화 + 대여 횟수 세기 |
| 4 | 0건 월 제거 |
| 5 | 월 오름차순, CAR_ID 내림차순 정렬 |
정답 쿼리
SELECT
MONTH(START_DATE) AS MONTH,
CAR_ID,
COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
AND CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
)
GROUP BY MONTH, CAR_ID
HAVING RECORDS > 0
ORDER BY MONTH ASC, CAR_ID DESC;
쿼리가 길고 어려워지고 있다. 단계별로 어떤 작업을 수행해야 하는지 먼저 정리하는 것이 중요하다는 것을 다시금 깨닫는다.
요금이 탈 때마다 100원씩 인상된다.
공차가 100인 등차수열이라고 생각할 수 있음
그렇다면 총 요금은 등차수열의 합 공식을 이용해서 구할 수 있다.
n * (a+l) / 2 (n은 항의 갯수, a는 첫째 항, l은 끝 항)
여기에 price 를 곱하면 총합이다.
즉, total_cost = price count (count + 1) // 2
정답 코드
def solution(price, money, count):
total_cost = price * count * (count + 1) // 2 # 총 이용 요금
shortage = total_cost - money # 부족한 금액
return shortage if shortage > 0 else 0 # 부족하면 차액, 아니면 0
s.isdigit() 문자열 s가 숫자로만 구성되어 있는지를 확인한다.
isdigit()는 공백, 기호, 문자 등 모두 False를 반환함.
len(s) in [4, 6] 문자열의 길이가 4 또는 6인지 확인
in 연산자는 리스트 안에 있는지를 확인해 주는 기능을 가짐.
정답 코드
def solution(s):
return s.isdigit() and len(s) in [4, 6]