ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers, Lv2] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
    프로그래밍 언어/SQL 2024. 6. 25. 23:50

    문제

    문제1 : 코딩테스트 연습 - 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

     

    프로그래머스

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

    programmers.co.kr

     

    • car_rental_company_car 테이블에 다음 문구 중 1개라도 들어가 있어야 한다.
      • 통풍시트
      • 열선시트
      • 가죽시트
    • 자동차 종류를 기준으로 오름차순 정렬

    문제 접근 

    해당 문제를 접근하는 방법으로 3가지 계획을 세웠다

    1. options 컬럼을 STRING_SPLIT을 사용하여 ','을 기준으로 분할하고, IN을 사용하여 해당 내용 중에 '통풍시트', '열선시트', '가죽시트'가 들어있는지 확인
    2. WHERE절에서 LIKE를 활용하여,  '%통풍시트%', '%열선시트%', '%가죽시트%'  처럼 해당 문자열이 포함되어 있는지 확인

    필요 내용 

    해당 계획대로 구현하기 위해 나는 다음과 같은 내용을 학습해야할 필요가 있었다.

    1. STRING_SPLIT함수 사용 방법

     

    구현 중 발생한 문제

    문제1. STRING_SPLIT 함수

    STRING_SPLIT함수 사용이 불가능

    각 옵션이 ','으로 구분되어 있는 만큼 STRING_SPLIT함수를 통해 분할한 뒤,
    IN함수로 하나라도 동일한 경우를 추출해 내면 어떨까 생각이 들었다.

     

    참고 : STRING_SPLIT(Transact-SQL) - SQL Server | Microsoft Learn

     

    STRING_SPLIT(Transact-SQL) - SQL Server

    STRING_SPLIT 함수의 Transact-SQL 참조입니다. 이 테이블 반환 함수는 문자 구분 기호를 기준으로 문자열을 부분 문자열로 분할합니다.

    learn.microsoft.com

     

    위 사이트를 참고한 뒤, 실제 구현을 해본 결과

    Programmers에서 STRING_SPLIT을 사용할 경우, 다음과 같은 에러가 발생하였다.

    check the manual that corresponds to your MySQL server version

    해결1

    계획 2로 문제를 풀기로 하였다.

     

    문제2. LIKE, IN

    LIKE, IN 사용 미숙으로 인한 오류

    WHERE절에서 IN을 사용할 경우

    data IN ('a', 'b', 'c')를 data = 'a' OR data = 'b' OR data = 'c'로 처리한다고 이해를 했었다.

     

    여기에 특정 문자열이 포함되었는지 판단하는 LIKE를 추가할 경우,

    다수의 문자열에 대해서 포함 여부를 판단할 수 있지 않을까 하는 생각으로 구현을 하였다.

     

    -- 초기 구상
    SELECT car_type, count(*) as cars
    FROM car_rental_company_car
    WHERE options IN (LIKE '%통풍시트%', LIKE '%열선시트%', LIKE '%가죽시트%')
    GROUP BY car_type
    ORDER BY car_type

     

    WHERE 절이 options LIKE '%통풍시트%' OR options LIKE '%열선시트%' OR options LIKE '%가죽시트%'와

    같이 동작하지 않을까? 싶어 구현한 코드지만, 예상과는 다르게 동작하지 않았다.

     

    아마 내 생각으로는

    data IN ('a', 'b', 'c')를 data = 'a' OR data = 'b' OR data = 'c'로 처리하는 만큼

     

    options IN (LIKE '%통풍시트%', LIKE '%열선시트%', LIKE '%가죽시트%')은 

    options = LIKE '%통풍시트%' OR options = LIKE '%열선시트%' OR options = LIKE '%가죽시트%'와 같이

    문법과 어긋난 형태라서 동작하지 않았던게 아닐까 싶다.

     

    해결2

    WHERE절을 LIKE와 OR을 사용하여 다음과 같이 구현하였다.

    options LIKE '%통풍시트%' OR options LIKE '%열선시트%' OR options LIKE '%가죽시트%'

     

    코드

    더보기
    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

     

    결과화면

     

     

    아쉬운 점

    문제를 다시 읽었을 때, 아쉬움이 많이 남았었다. 최종적으로 option에 시트가 들어간 항목이 통풍시트, 열선시트, 가죽시트 세 가지 종류밖에 없어,LIKE '%시트%'형태로도 충분히 검색이 가능하였다. 

     

    지금은 비효율 적으로 코드를 짯지만, 나중에 필터링해야 할 예외가 추가로 늘어날 상황을 미리 경험했다고 생각하기로 했다.

     

    또한, REGEXP라는 정규 표현식을 통하여 검색 또한 가능하였는데,

    이 부분에 대해서는 추가로 공부를 해야겠단 생각이 들었다.

Designed by Tistory.