SQL 고득점 Kit: 평균 일일 대여 요금 구하기
다음은 어느 자동차 대여 회사에서 대여 중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다.CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어 있으며,CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS
Reference: https://school.programmers.co.kr/learn/courses/30/lessons/151136
문제 설명 ✅
다음은 어느 자동차 대여 회사에서 대여 중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다.
CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어 있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.
#### 테이블 구조
| Column name | Type | Nullable | | :-: | :-: | :-: | | CAR_ID | INTEGER | FALSE | | CAR_TYPE | VARCHAR(255) | FALSE | | DAILY_FEE | INTEGER | FALSE | | OPTIONS | VARCHAR(255) | FALSE |
1. 자동차 종류는 세단, SUV, 승합차, 트럭, 리무진 이 있습니다. 2. 자동차 옵션 리스트는 콤마(,)로 구분된 키워드 리스트로 되어 있으며, 키워드 종류는 다음과 같습니다. (주차감지센서, 스마트키, 네비게이션, 통풍시트, 열선시트, 후방카메라, 가죽시트)
문제 ✅
CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 SUV 인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요.
1. 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림 2. 컬럼명은 AVERAGE_FEE 로 지정
예시 ✅
예를 들어 CAR_RENTAL_COMPANY_CAR 테이블이 다음과 같다면
| CAR_ID | CAR_TYPE | DAILY_FEE | OPTIONS | | :-: | :-: | :-: | :-: | | 1 | 세단 | 16000 | 가죽시트,열선시트,후방카메라 | | 2 | SUV | 14000 | 스마트키,네비게이션,열선시트 | | 3 | SUV | 22000 | 주차감지센서,후방카메라,가죽시트 |
자동차 종류가 SUV 인 자동차들의 평균 일일 대여 요금은 18000 원이므로, 다음과 같은 결과가 나와야 합니다.
| AVERAGE_FEE | | :-: | | 18000 |
통과한 코드 ✅
SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = "SUV"보충 ✅
Reference: https://docs.oracle.com/en/database/other-databases/timesten/22.1/sql-reference/round-expression.html
평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림 하라는 조건이 있었는데, 기본값을 지정하지 않으면 첫 번째 자리에서 반올림합니다. 정답은 맞췄지만 의도한 대로 코드가 동작했다고 보긴 어렵기에, ROUND 함수에 대해 간단히 정리하겠습니다.
ROUND 함수는 Expression1을 Expression2 자리까지 반올림한 값을 반환합니다.
ROUND (Expression1 [,Expression2])Expression1은 반올림할 대상을 의미하고, Expression2는 반올림할 자릿수를 의미합니다. 이때, Expression2는 반드시 정수여야 합니다. Expression2를 생략하면 소수점 첫 번째 자리에서 반올림하며, 음수를 지정하면 소수점 왼쪽 자리에서 반올림(15.4444와 -1을 전달했다면 5를 반올림하여 결과가 20이 된다는 것을 의미) 합니다. 반올림은 근사값을 구하는 방법 중 하나입니다. 따라서 -2.9의 근사값(가장 가까운 정수)는 -3입니다.
추가적으로 은행가의 반올림(Banker’s rounding)에 대해 알아두면 좋습니다. 은행가의 반올림은 소수 부분이 .5 일 때 가장 가까운 '짝수'로 반올림하는 방식입니다.
SELECT ROUND(2.5f), ROUND(3.5f) FROM dual;
결과: 2, 4
금융 거래에서는 이자, 세금, 환율처럼 아주 작은 소수 단위의 금액을 대량으로 반복 계산하는 과정에서 일반적인 반올림 방식(.5는 항상 올림)을 사용하면 계산 결과가 지속적으로 증가하는 방향으로 편향되는 문제가 발생했습니다.
이러한 누적 편향은 장기적으로 금액의 불공정을 초래할 수 있었기 때문에, 이를 해결하기 위해 .5 인 경우에는 가장 가까운 짝수로 반올림하는 규칙을 도입했습니다. 이 방식은 올림과 내림이 통계적으로 균형을 이루어, 반복 계산에서도 평균값이 치우치지 않도록 보장합니다.
⚠️ 앞으로 SSAFY 과정에서 학습할 알고리즘과 개인적으로 학습할 SQL을, 오늘과 같은 방식으로 적은 양이라도 꾸준히 정리할 생각입니다. 풀이 과정에서는 AI를 정답 도출 수단이 아닌, 필요한 개념을 파악하기 위한 보조 도구로만 활용하고, 실제 해결은 문서 탐색과 스스로의 사고를 통해 진행할 계획입니다. 단편적인 풀이 암기보다는 은행가의 반올림과 같이 문제의 배경과 본질적인 이론까지 함께 정리하고자 합니다. 코딩 테스트는 결국 개념을 얼마나 정확히 이해하고 이를 코드로 표현할 수 있는지를 묻는 과정이라 생각하며, 이러한 관점에서 학습을 지속해 나갈 것입니다.
More to read
Amazon VPC Architecture 이해하기
새로운 프로젝트를 기획하며, 개발에서 무엇을 가장 먼저 고민해야 하는지 다시 돌아보게 되었습니다.한때는 프론트엔드가 모든 설계의 출발점이라고 믿었습니다. 유저가 무엇을 보고, 어떤 흐름에서 머무르고 이탈하는지에 대한 이해 없이 서비스를 만든다는 건 불가능하다고 생각했기
'원사이트'프론트엔드 관점으로 알고리즘 이해하기
오랜만에 방법론에 관한 글을 쓰게 되었습니다. 최근 상황은 이렇습니다. SSAFY에서는 하루에 엄청난 양의 알고리즘 문제들을 과제로 수행하게 됩니다. 그 과정에서, '구현력'이 매우 떨어진다는 생각이 들었습니다. 완전히 어려운 문제라면 '아쉬움'이라는 감정조차 느끼지
SubnetVPC 설계의 시작: IP와 Subnet
반복되는 루틴 속에서 얻은 안정감을 발판 삼아, 이제는 기술적 스펙트럼을 넓히기 위한 개인 프로젝트에 착수하고자 합니다.이번 프로젝트의 목표는 단순한 포트폴리오 구축을 넘어, 실제 서비스 수준의 블로그 시스템 구현과 다국어 처리 적용 등 실무에 가까운 역량을 한 단계