[내배캠] 데이터분석 6기/본캠프 기록

[본캠프 23일차] SQL 코드카타, 파이썬 코드카타, 기초 프로젝트 준비

물맨두 2025. 3. 20. 23:43

 

 

 

오늘 한 일은,

  • SQL 공부
    • [코드카타] SQL 1문제 풀기 (97번)
  • 파이썬 공부
    • [코드카타] 알고리즘 1문제 풀기 (61번)
    • [라이브 세션] 파이썬 라이브러리 개인과제 해설 수강하기
  • 기초 프로젝트
    • 기초 프로젝트 주제 선정하기
    • 문제 설정을 위한 자료 조사 및 EDA 진행하기

 

SQL 공부: [코드카타] SQL 문제 풀기 (97번)

원래는 코드카타 문제를 SQL은 3문제, 알고리즘은 1문제씩 풀었는데 프로젝트 기간에는 프로젝트에 더 집중하고자 SQL과 알고리즘 모두 한 문제씩만 풀기로 했다. 분량도 중요하지만, 우선은 우선순위를 고려하면서도 꾸준히 다른 공부도 병행하고 싶어서 아예 안 하는 것보단 조금이라도 풀기로 했다.

97. (1174) Immediate Food Delivery 2

If the customer's preferred delivery date is the same as the order date, then the order is called immediate; otherwise, it is called scheduled.
The first order of a customer is the order with the earliest order date that the customer made. It is guaranteed that a customer has precisely one first order.
Write a solution to find the percentage of immediate orders in the first orders of all customers,
rounded to 2 decimal places.

SELECT ROUND((SUM(CASE WHEN order_date = customer_pref_delivery_date THEN 1 ELSE 0 END) / COUNT(*))*100, 2) immediate_percentage
FROM Delivery
WHERE (customer_id, order_date) IN (
    SELECT customer_id,
        MIN(order_date)
    FROM Delivery
    GROUP BY customer_id)

이번에는 한 번에 풀었다.

 

우선 고객의 첫 번째 주문 데이터만 가져오게끔 WHERE절부터 작성한다. customer_id와 order_date를 쌍으로 확인하는데, 이때 서브쿼리 안에 조회되는 order_date는 해당 고객의 가장 오래된 데이터만 가져오도록 MIN() 함수를 사용한다.

 

그리고 이제 immediate_percentage 컬럼을 구한다.

집계함수 SUM()에 CASE WHEN 구문을 사용해 order_date와 customer_pref_delivery_date가 일치할 때 1을 더해주는 것으로 그 수를 집계하고, 백분율을 계산하기 위해 분모값으로는 COUNT(*)를 사용해 총 건수를 집계한다.

그 상태에서 100을 곱하고, ROUND() 함수로 소수점 2자리수까지만 나타나도록 설정한다.

 


 

파이썬 공부: [코드카타] 알고리즘 문제 풀기 (61번)

61.  로또의 최고 순위와 최저 순위

문제 설명(…민우씨, 그, QR코드로, 아닙니다……)

def solution(lottos, win_nums):
    hit = 0 #맞힌 숫자를 저장할 변수
    chance = 0 #가려진 숫자를 저장할 변수
    
    for i in lottos: #로또에서 맞힌 숫자와 가려진 숫자를 저장한다
        if i in win_nums:
            hit += 1
        elif i == 0:
            chance += 1
    
    rank = {6:1, 5:2, 4:3, 3:4, 2:5, 1:6, 0:6} #몇 개를 맞히는지에 따라 달라지는 등수 정보를 담은 딕셔너리
    answer = [rank[hit+chance], rank[hit]] #맞힌 숫자와 맞힐 가능성까지 더해서 최고 순위와 최저 순위를 answer에 담는다
    
    return answer

우선 lottos에서 맞힌 숫자와 가려진 숫자를 for문으로 센다. 한 번에 두 가지 변수를 모두 구하도록 if에 elif도 사용했다.

 

이제 순위에 관한 부분을 어떻게 작성할까 고민하다가 딕셔너리로 맞힌 숫자와 해당 등수를 쌍으로 묶어서 담았다. 그리고 answer에 맞힌 숫자와 가려진 숫자까지 다 맞았을 경우에 해당하는 등수(= 최고 순위), 그리고 맞힌 숫자만 맞았을 경우에 해당하는 등수(= 최저 순위)를 answer에 담아내도록 했다.