KATA#22

codataffee·2024년 5월 1일
0

CODEKATA

목록 보기
22/114
post-thumbnail

WHAT IS KATA?

KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.

이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.


- SQL


✔️ 문제 #1: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기


✔️ 제출 쿼리

✔️ 쿼리 분석

SELECT A.CAR_ID, 
       A.CAR_TYPE, 
       ROUND(DAILY_FEE * 30 * (1-DISCOUNT_RATE*0.01),0) FEE
FROM (
      SELECT * 
      FROM CAR_RENTAL_COMPANY_CAR 
      WHERE CAR_TYPE IN ('세단', 'SUV')
     ) A LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN B 
      ON A.CAR_TYPE = B.CAR_TYPE AND DURATION_TYPE = '30일 이상'
WHERE CAR_ID NOT IN (
                     SELECT CAR_ID 
                     FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                     WHERE ("2022-11-01" BETWEEN START_DATE AND END_DATE)
                        OR ("2022-11-30" BETWEEN START_DATE AND END_DATE)
                    )
GROUP BY CAR_ID
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY FEE DESC, A.CAR_TYPE, A.CAR_ID DESC


✔️ 문제 #2: 자동차 대여 기록 별 대여 금액 구하기


✔️ 제출 쿼리

✔️ 쿼리 분석

WITH TR AS (
            SELECT CC.CAR_ID CI,
                   CC.CAR_TYPE CT,
                   CC.DAILY_FEE CF,
                   RH.HISTORY_ID HI,
                   RH.START_DATE SD,
                   RH.END_DATE ED,
                   (DATEDIFF(RH.END_DATE, RH.START_DATE) + 1) P
            FROM CAR_RENTAL_COMPANY_CAR AS CC 
                 JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS RH
                 ON CC.CAR_ID = RH.CAR_ID
            WHERE CC.CAR_TYPE LIKE '트럭'
            ),
    TRDC AS (
            SELECT (1-DISCOUNT_RATE*0.01) DR,
                    DURATION_TYPE DT
            FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
            WHERE CAR_TYPE = '트럭'
            )
            
SELECT TR.HI HISTORY_ID,
       ROUND(TR.CF * TR.P *
             CASE WHEN TR.P >= 90 THEN (SELECT DR FROM TRDC 
                                        WHERE DT = '90일 이상')
                  WHEN TR.P BETWEEN 30 AND 89 THEN (SELECT DR FROM TRDC 
                                                    WHERE DT = '30일 이상')
                  WHEN TR.P BETWEEN 7 AND 30 THEN (SELECT DR FROM TRDC 
                                                   WHERE DT = '7일 이상')
             ELSE 1 END, 0) FEE
FROM TR
ORDER BY FEE DESC, HISTORY_ID DESC


✔️ 문제 #3: 상품을 구매한 회원 비율 구하기

✔️ 제출 쿼리

✔️ 쿼리 분석

SELECT DATE_FORMAT(OS.SALES_DATE,"%Y") YEAR,
       DATE_FORMAT(OS.SALES_DATE,"%m") MONTH,
       COUNT(DISTINCT OS.USER_ID) PURCHASED_USERS,
       ROUND(COUNT(DISTINCT OS.USER_ID)/
                                        (SELECT COUNT(DISTINCT USER_ID)
                                         FROM USER_INFO
                                         WHERE DATE_FORMAT(JOINED,"%Y") = '2021'
                                         ),1) PURCHASED_RATIO
FROM ONLINE_SALE OS LEFT JOIN USER_INFO UI
     ON OS.USER_ID = UI.USER_ID 
WHERE DATE_FORMAT(UI.JOINED,"%Y") = '2021'
GROUP BY DATE_FORMAT(OS.SALES_DATE,"%Y"), DATE_FORMAT(OS.SALES_DATE,"%m")
ORDER BY YEAR, MONTH


- PYTHON


✔️ 문제 #1: 제일 작은 수 제거하기

✔️ 제출 코드

✔️ 코드 분석

def solution(arr):
    if len(arr)==1:          # arr 길이가 1인 경우
        return [-1]          # -1 반환
    arr.remove(min(arr))     # arr 에서 최소값 제거
    return arr


✔️ 문제 #2: 가운데 글자 가져오기

✔️ 제출 코드

✔️ 코드 분석

def solution(s):
    if len(s) % 2 == 0:
        return s[int(len(s)/2)-1:int(len(s)/2)+1]
    else:
        return s[int(len(s)/2)]


✔️ 문제 #3: 수박수박수박수박수?

✔️ 제출 코드

✔️ 코드 분석

def solution(n):
    list = []
    for i in range(n):
        if i % 2 == 0:
            list.append('수')
        else:
            list.append('박')
    return list

def solution(n):
    list = []
    for i in range(n):
        if i % 2 == 0:
            list.append('수')
        else:
            list.append('박')
    return (''.join(list))


✔️ CHECK POINT

  • SQL
    • SELECT 절 안에 연산을 하면서,
      연산 안의 값에 CASE WHEN 구문을 사용하고,
      조건에 맞는 해당값을 서브쿼리 형식으로 SELECT를 또 할 수 있다는 .. 것을 알았다.
      사고의 전환.. 해당하는 데이터를 제대로 불러오기만 한다면,
      몇 번이고 불러오면서 쿼리를 작성할 수도 있겠다!
      ROUND(TR.CF * TR.P *
                CASE WHEN TR.P >= 90 THEN (SELECT DR FROM TRDC 
                                           WHERE DT = '90일 이상')
                     WHEN TR.P BETWEEN 30 AND 89 THEN (SELECT DR FROM TRDC 
                                                       WHERE DT = '30일 이상')
                     WHEN TR.P BETWEEN 7 AND 30 THEN (SELECT DR FROM TRDC 
                                                      WHERE DT = '7일 이상')
                ELSE 1 END, 0) FEE
  • PYTHON
    • 알고리즘 코드카타 3번 문제에서 원하는 조건에 해당하는 값을 리스트에 불러오기는 성공했으나, 그 리스트의 값들을 한 줄로 출력하는 방법에 대해 다시 한 번 알게 되었다.
    • '구분자'.join(리스트) : 조인 함수를 통해 리스트 내 값들을 이어서 출력할 수 있다.

profile
커피 좋아하는 데이터 꿈나무

0개의 댓글

관련 채용 정보