[데이터분석] 부트캠프 TIL

20260120 TIL

myun0506 2026. 1. 20. 21:50

[Today I Learn]

- SQL codekata

- Python codekata

- 전처리 시각화 세션


[SQL codekata]

- 문제 1.

1. 문제 링크: https://leetcode.com/problems/list-the-products-ordered-in-a-period/description/

2. 정답 코드

select p.product_name, sum(o.unit) as unit
from products p 
join orders o
on p.product_id = o.product_id 
where o.order_date >= '2020-02-01' and o.order_date < '2020-03-01'
group by p.product_name
having sum(o.unit) >= 100

 

3. 오류 상황: unit이 100개 이상이어야 한다는 조건에 처음엔 where 절에 추가했다가 계속 아무런 값도 조회되지 않아서 생각해보니 그 상품의 합 unit이 100개 이상이어야한다는 것을 깨닫고 having 절로 옮김

4. 개선할 점: product_name이 같은 상품이 있을 수 있으므로 primary key인 product_id도 group by 절에 추가해주기 (group by 절에 product_id만 넣을 경우 product_id를 group by절에 없이 select 한다는 점에서 오류 발생할 수 있음)

select p.product_name, sum(o.unit) as unit
from products p 
join orders o
on p.product_id = o.product_id 
where o.order_date >= '2020-02-01' and o.order_date < '2020-03-01'
group by p.product_id, p.product_name
having sum(o.unit) >= 100

5. 추가로 개선할 점: 만약 orders 테이블이 엄청나게 대량이라면 이를 다 가져오는 것 말고 미리 필터링을 해서 가져오는 것이 훨씬 효율적임 → 2월 데이터만 미리 필터링 해서 join 하기

select p.product_name, sub.unit
from products p 
join ( 
    select o.product_id, sum(o.unit) as unit
    from orders o 
    where o.order_date >= '2020-02-01' and o.order_date < '2020-03-01'
    group by o.product_id
    having sum(o.unit) >= 100
) sub
on p.product_id = sub.product_id

[Python codekata] 

- 문제 1. 프로그래머스 나머지 구하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/120810

2. 정답 코드

def solution(num1, num2):
    try:
        return num1%num2
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")

3. 개선할 점: 문제에서 제한 사항으로 num1과 num2는 0 초과 100 이하라고 해서 zerodivisionerror가 발생할 위험이 없는데도 try-except문을 불필요하게 사용함. (try-except는 내부적으로 Context Switching이나 예외 테이블 조회 등의 비용을 수반함 !!)

4. 문제점: 이 solution 함수를 사용할 땐 result = solution(a, b) + 10 같은 코드를 짤 것. 이때 except 조건처럼 return의 명시적 반환값이 없다면 None이 반환되어 시스템은 TypeError을 발생시킬 것 → 만약 except문을 써야하는 조건이 있다면 차라리 raise ValueError 하는 것이 더 나은 방법!

5. 수정된 코드

def solution(num1, num2):
    return num1%num2

 

- 문제 2. 프로그래머스 두 수의 곱 구하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/120804

2. 정답 코드

solution = lambda num1, num2: num1*num2

 

- 문제 3. 프로그래머스 몫 구하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/120805

2. 정답 코드

def solution(num1, num2):
    return num1//num2
def solution(num1, num2):
    quotient, remainder = divmod(num1, num2)
    return quotient
def solution(num1, num2):
    return divmod(num1, num2)[0] # 몫

 

3. 여러 방식 비교 분석

  • num1 // num2 (Floor Division)
    • 가장 파이썬다운 방식이자 효율적인 방식
    • // 연산자는 내부적으로 정수 나눗셈만을 수행하도록 설계되어 있어 속도가 빠름
    • 이 방식은 단순히 소수점을 버리는게 아니라, 내림(Floor)을 수행함 (만약 제약사항이 바뀌어 음수가 포함된다면 int(num1/num2)와 결과가 달라짐
      • Floor (내림, // 연산자): 수직선 상에서 왼쪽으로 가장 가까운 정수를 선택함
      • Truncation (버림, int() 함수): 소수점 아래를 단순히 잘라냄 즉, 0을 향해 이동
  • divmod(num1, num2)
    • divmod는 몫과 나머지를 동시에 반환하는 내장 함수
    • 나머지가 필요 없는 상황에서 divmod를 호출하는 것은 불필요한 튜플 생성 및 패킹/언패킹 오버헤드를 발생시킴
  • int(num1 / num2) (Truncation)
    • / 연산은 결과로 부동 소수점(Float)을 반환함 
    • 최악의 선택! 정수 연산 만으로 끝낼 수 있는 문제임

- 문제 4. 프로그래머스 두 수의 합 구하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/120802

2. 정답 코드

def solution(num1, num2):
    return num1 + num2
solution = lambda num1, num2: num1+num2
solution = lambda *x: sum(x)
  • *x (Packing 방식)
    • Iterables 생성: 호출자가 solution(2, 3)을 실행하면 파이썬 인터프리터는 전달된 인자들을 하나의 Immutable Tuple로 묶음
      • 즉, x = (2, 3)이라는 객체가 생성됨
    • 메모리 오버헤드: 레지스터나 스택에서 두 수를 더하면 끝날 일을 굳이 튜플 객체를 생성하고 메모리를 할당하는 과정을 추가한 것
    • 내장 함수 호출 비용: sum()은 반복 가능한 객체를 순회하며 값을 더함. 
      • 이 과정에서 Iterator가 생성되고 루프가 실행됨
      • 정수 두 개를 더하는 연산에 비해 훨씬 많은 CPU 사이클을 소모함

- 문제 5. 프로그래머스 각도기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/120829

2. 정답 코드

def solution(angle):
    if 0< angle < 90:
        return 1
    elif angle == 90: 
        return 2
    elif angle < 180: 
        return 3
    elif angle == 180:
        return 4
    else:
        raise ValueError("0 < x <= 180 범위 내로만 입력 가능합니다.")

[ 전처리 시각화 세션 3-1 ]

- 1차 정제 (문자열/결측/타입 통일)

- GroupBy 기초 (단일 기준 집계)

- 데이터 결합 (merge / join / concat 차이 체감)

- apply / map (언제 쓰는가)

- 저장 & 재현성(검증 로드까지)

- GroupBy(그룹화) 이론

- 피벗(표 형태 변환) 이론: "리포트용 표 만들기"

- 문자열 처리 이론(실무형) 확장

- 시간 데이터 처리 이론

- 데이터 결합(merge/join/concat)

- apply vs map

 

https://myun0506.tistory.com/70

 

GroupBy 결합, apply/map 사용

[ 전처리 시각화 세션 3-1 ]- 1차 정제 (문자열/결측/타입 통일)날짜 → datetime 변환 + 파생피처 만들기메뉴 문자열 정리 (strip + 표기 통일)price 정리 ("4,500원" → 4500)qty 정리 (결측 처리 + 숫자형)paid

myun0506.tistory.com

 

  •  

'[데이터분석] 부트캠프 TIL' 카테고리의 다른 글

20260126 TIL  (0) 2026.01.26
20260122 TIL  (0) 2026.01.22
20260119 TIL  (0) 2026.01.19
20260116 TIL  (0) 2026.01.16
20260115 TIL  (1) 2026.01.15