안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "자동차 종류별 특정 옵션이 포함된 자동차 수 구하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/151137)
1. 문제 : 자동차 종류별 특정 옵션이 포함된 자동차 수 구하기(Lv. 2)
2. 문제 설명
다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 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 |
자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진'이 있습니다.
자동차 옵션 리스트는
콤마(',')로 구분된 키워드 리스트(옵션 리스트 값 예시: '열선시트', '스마트키', '주차감지센서')로 되어있으며,
키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트'가 있습니다.
[ 문제 ]
CAR_RENTAL_COMPANY_CAR 테이블에서
'통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이
포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요.
이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.
[ 예시 ]
예를 들어 CAR_RENTAL_COMPANY_CAR 테이블이 다음과 같다면
CAR_ID | CAR_TYPE | DAILY_FEE | OPTIONS | |
1 | 세단 | 16000 | 가죽시트,열선시트,후방카메라 | |
2 | SUV | 14000 | 스마트키,네비게이션,열선시트 | |
3 | SUV | 22000 | 주차감지센서,후방카메라 | |
4 | 트럭 | 35000 | 주차감지센서,네비게이션,열선시트 | |
5 | SUV | 16000 | 가죽시트,네비게이션,열선시트,후방카메라,주차감지센서 |
'통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차는 자동차 ID가 1, 2, 4, 5인 자동차이고,
자동차 종류 별로 몇 대인지 구하고 자동차 종류를 기준으로 오름차순 정렬하면
다음과 같은 결과가 나와야 합니다.
[ 출력 결과 ]
CAR_TYPE | CARS |
SUV | 2 |
세단 | 1 |
트럭 | 1 |
3. 문제 풀이
# 1안
SELECT CAR_TYPE
, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE (OPTIONS LIKE '%통풍시트%') OR (OPTIONS LIKE '%열선시트%') OR (OPTIONS LIKE '%가죽시트%')
GROUP
BY CAR_TYPE
ORDER
BY CAR_TYPE ASC ;
# 2안
SELECT CAR_TYPE
, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
GROUP
BY CAR_TYPE
ORDER
BY CAR_TYPE ASC ;
이번 문제는 1안과 2안 두 가지로 작성했습니다!
# 1안 풀이 설명
# [ 문제 접근 설명 ]
이번 문제의 요구사항을 정리하면,
특정 옵션을 하나라도 가지고 있는 차량을 집계해서 개수를 파악하는 문제라는 걸 알 수 있어요!
(옵션은 '통풍시트' / '열선시트' / '가죽시트')
한 가지 중요한 것은
'OPTIONS' 컬럼의 값을 보면
"가죽시트,열선시트,후방카메라"
이렇게 하나의 컬럼에 컬럼(",")으로 구별하여 여러 개의 값이 들어가 있는 것을 확인할 수 있어요!
따라서 ' WHERE '문을 이용해서 특정 옵션을 가지고 있는 데이터만 선별한 후
' GROUP BY '문을 이용해서 CAR_TYPE 별로 차량 수를 구하면 됩니다!
# [ 1안 쿼리 작성 설명 ]
1안 쿼리는 WHERE 문에 'LIKE 문'을 이용해서 특정 옵션을 가지고 있는 데이터를 선별했어요!
WHERE (OPTIONS LIKE '%통풍시트%') OR (OPTIONS LIKE '%열선시트%') OR (OPTIONS LIKE '%가죽시트%')
OPTIONS 컬럼에서 위치에 상관없이 '통풍시트' 혹은 '열선시트' 혹은 '가죽시트'를 포함하는 데이터를 조회!
이후 " GROUP BY " 와 " ORDER BY "를 이용해서 집계하고 정렬하도록
쿼리를 작성했습니다!
# [ 2안 쿼리 작성 설명 ]
2안 쿼리는 정규식을 이용해서 특정 옵션을 가지고 있는 데이터를 선별했어요!
WHERE OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
OPTIONS 컬럼에서 정규표현식을 통해 값이 '통풍시트' 혹은 '열선시트' 혹은 '가죽시트'를 포함하는 데이터를 조회!
이후 1안과 마찬가지로
" GROUP BY " 와 " ORDER BY "를 이용해서 집계하고 정렬하도록
쿼리를 작성했습니다!
4. 데코의 문제 풀이 후기
이번 문제는 특정 값을 가진 데이터만을 필터링하고 집계하는 문제예요!
단순하게 LIKE 문을 써서 특정 옵션을 가진 데이터만을 조회하는 거면 간단한 문제인데,
정규표현식으로 접근하면 체감 난이도가 올라갈 것 같아요!
SQL에서도 정규표현식(Regular Expression)이 가능해요!
정규표현식은 특정한 규칙(패턴)을 가진 문자열을 표현하는 형식 언어예요!
정규표현식을 통해
특정한 규칙(패턴)을 가진 문자를 검색하거나 새로운 문자로 치환하여 처리할 수 있어요!
아래에 종종 이용하는 정규표현식 일부를 정리해 보았습니다!
# 일치 관련
- . : 문자 하나
ex) "...."
>> 네 글자 이상의 문자열을 찾음
- | : or의 의미
ex ) "A|B|C"
>> A 혹은 B 혹은 C를 가진 문자열을 찾음
- ^ : 시작하는 문자열
ex) "^아침"
>> "아침"으로 시작하는 문자열을 찾음
- $ : 끝나는 문자열
ex) "저녁$"
>> "저녁"으로 끝나는 문자열을 찾음
# 문자 관련
- [A-z] : 알파벳 대문자, 알파벳 소문자 문자열 포함 여부
ex) "^[A-Z]"
>> 알파벳 대문자 혹은 알파벳 소문자로 시작하는 문자열을 찾음
- [0-9] : 숫자 포함 여부
ex) "^[0-9]"
>> 숫자로 시작하는 문자열을 찾음
(정규표현식에 대해 더 자세하게 보고 싶으시면 우측 링크를 참고해주세요! : 정규표현식 정리)
정규표현식을 다 암기하고 있기에는 내용이 정말 많아서
저도 기본적인 내용만 일부 기억하고 있고
필요한 정규표현식이 있으면 그때그때 구글링하고 검색하면서 쿼리를 작성하고 있어요...!
이번 문제는 특정 값을 가진 데이터만을 필터링하고 집계하는 문제를 풀어봤습니다!
이제 SELECT, GROUP BY, ORDER BY와 같이 너무 간단한 쿼리는
최대한 풀이에서 제외하고 설명하려고 합니다!
물론 어렵거나 특이한 내용을 포함하면 설명할 예정이고요!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분은 그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 읽어주셔서 감사해요!
또 다른 SQL 문제로 찾아뵐게요!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 조건에 맞는 도서 리스트 구하기(프로그래머스/MySQL/Level 1) (25) | 2023.01.28 |
---|---|
[SQL] 자동차 대여 기록에서 장기/단기 대여 구분하기(프로그래머스/MySQL/Level 1) (32) | 2023.01.18 |
[SQL] 평균 일일 대여 요금 구하기(프로그래머스/MySQL/Level 1) (45) | 2023.01.14 |
[SQL] 재구매가 일어난 상품과 회원 리스트 구하기(프로그래머스/MySQL/Level 2) (21) | 2023.01.12 |
[SQL] 가격대 별 상품 개수 구하기(프로그래머스/MySQL/Level 2) (33) | 2023.01.10 |