KATA#13

codataffee·2024년 4월 22일
0

CODEKATA

목록 보기
13/114
post-thumbnail

WHAT IS KATA?

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

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


- SQL


✔️ 문제 #1: 대여 기록이 존재하는 자동차 리스트 구하기

✔️ 제출 쿼리

✔️ 쿼리 분석

SELECT DISTINCT RH.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR CC JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY RH
     ON CC.CAR_ID = RH.CAR_ID
WHERE START_DATE LIKE '2022-10%'
      AND CAR_TYPE = '세단'
ORDER BY 1 DESC


✔️ 문제 #2: 모든 레코드 조회하기

✔️ 제출 쿼리

✔️ 쿼리 분석

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID


✔️ 문제 #3: 즐겨찾기가 가장 많은 식당 정보 출력하기

✔️ 제출 쿼리

✔️ 쿼리 분석

---
# CTEs(Common Table Expressions) 사용:
MaxFavorites CTE로 각 FOOD_TYPE에 대해 최대 FAVORITES 값을 조회.
메인 쿼리에서 REST_INFO 테이블(r로 별칭)과 MaxFavorites CTE(mf로 별칭)를 조인.

조인 조건은 동일한 FOOD_TYPE을 가지며, 
FAVORITES 값이 그 음식 종류의 최대 즐겨찾기 수(MaxFav)와 일치하는 레코드를 찾는 것.

마지막으로, 결과를 FOOD_TYPE으로 내림차순 정렬.

WITH MaxFavorites AS (
                      SELECT FOOD_TYPE, 
                             MAX(FAVORITES) AS MaxFav
                      FROM REST_INFO
                      GROUP BY FOOD_TYPE
                      )
SELECT r.FOOD_TYPE, 
       r.REST_ID, 
       r.REST_NAME, 
       r.FAVORITES
FROM REST_INFO r JOIN MaxFavorites mf 
     ON r.FOOD_TYPE = mf.FOOD_TYPE 
     AND r.FAVORITES = mf.MaxFav
ORDER BY r.FOOD_TYPE DESC;

---
# 윈도우 함수 사용:
각 음식 종류별로 즐겨찾기 수가 가장 많은 식당에 순위 부여 후, 
이 순위를 필터링해 각 음식 종류별로 가장 즐겨찾기 수가 많은 식당만을 선택

WITH RankedRestaurants AS (
                           SELECT FOOD_TYPE,
                           REST_ID,
                           REST_NAME,
                           FAVORITES,
                           ROW_NUMBER() OVER(PARTITION BY FOOD_TYPE 
                                             ORDER BY FAVORITES DESC
                                             ) AS RNK
                           FROM REST_INFO
                           )
SELECT FOOD_TYPE,
       REST_ID,
       REST_NAME,
       FAVORITES
FROM RankedRestaurants
WHERE RNK = 1
ORDER BY FOOD_TYPE DESC

---



내가 작성했던 오답 쿼리(위)에서는 일식의 즐겨찾기 수가 최대로 조회되지 않았다.
쿼리에 따른 구조에 대해 다시 한 번 고민하게 했던 문제.


- PYTHON


✔️ 문제 #1: 각도기

✔️ 제출 코드

✔️ 코드 분석

---

# if문으로 가정하여 구간 나누기

def solution(angle):
    if(angle>0 and angle<90):
        answer=1
    elif(angle==90):
        answer=2
    elif(angle>90 and angle<180):
        answer=3
    elif(angle==180):
        answer=4

    return answer
    
---

#다른 풀이: if문 안에 if문 넣기

def solution(angle):
    if angle<=90:
        return 1 if angle<90 else 2
    else:
        return 3 if angle<180 else 4
        
---


✔️ 문제 #2: 짝수의 합

✔️ 제출 코드

✔️ 코드 분석

def solution(n):               --- (solution 함수 정의, 하나의 매개변수 n을 받는다.)
    sum = 0                    --- (sum 변수 생성, 0으로 초기화)
    for i in range(0,n+1,2):   --- (for 루프 시작, i 는 0부터 시작해서 n+1까지 2씩 증가)
        sum += i               --- (루프의 반복에서 i의 값을 sum에 더한다.)
    return sum                 --- (sum 변수의 값을 반환)

✔️ 문제 #3: 배열의 평균값

✔️ 제출 코드

✔️ 코드 분석

def solution(numbers):                ---(solution 함수 정의, numbers라는 이름의 리스트를 매개변수로 받는다.)
    answer = sum(numbers)/len(numbers)---(numbers 리스트에 있는 모든 숫자의 합(sum)을 
                                          리스트의 길이(len)로 나눈 값을 저장)
    return answer


✔️ CHECK POINT

  • SQL

    1. CTEs(쿼리를 사용한 임시 데이터 세트)

      WITH 테이블 이름 AS (테이블 만들 쿼리문)
      서브 쿼리 문을 반복해서 쓰기보단 CTEs 사용하는 것이 효율적

    2. 윈도우 함수 사용

      N번째까지의 대상을 조회하고 싶을 때, RANK

  • 참고

    1. CTEs 관련 내용
    2. 윈도우 함수
  • PYTHON

    1. if 문 안에 if 문 넣는 방법
    2. for 문을 이용한 반복문
    3. 리스트의 합 (sum) 리스트 길이 (len)

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

0개의 댓글

관련 채용 정보