[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 사이클을 소모함
- Iterables 생성: 호출자가 solution(2, 3)을 실행하면 파이썬 인터프리터는 전달된 인자들을 하나의 Immutable Tuple로 묶음
- 문제 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 |