반응형
edit_note 오늘 코테 문제
| 문제 | 지폐 접기 (Lv.1) |
| 플랫폼 | 프로그래머스 |
| 난이도 | Lv. 1 |
| 핵심 요구사항 | 지폐를 90도 회전 가능 — 최소 접기 횟수로 지갑 안에 넣을 수 있는지 판별 |
python
def solution(wallet, bill):
answer = 0
wallet = [min(wallet), max(wallet)]
bill = [min(bill), max(bill)]
while wallet[0] < bill[0] or wallet[1] < bill[1]:
if bill[0] >= bill[1]:
bill[0] //= 2
else:
bill[1] //= 2
bill = [min(bill), max(bill)]
answer += 1
return answer
| 시간복잡도 | O(log N) — 매 반복마다 긴 변이 절반으로 줄어듦 |
풀이 접근법
이 문제의 핵심은 지폐를 90도 회전할 수 있다는 점을 활용해 방향 경우의 수를 제거하는 것이다. 회전 가능 조건을 if 분기로 처리하면 경우의 수가 늘어나지만, 미리 정렬로 방향 정보를 없애버리면 단일 비교 조건으로 깔끔하게 정리된다.
1
회전 가능성을 정렬로 흡수하기
지폐를 90도 돌릴 수 있으므로 wallet과 bill의 가로/세로 방향은 중요하지 않다. 둘 다
[min, max]로 미리 정렬하면 짧은 변끼리·긴 변끼리 비교하는 단순한 구조로 줄어든다.python
wallet = [min(wallet), max(wallet)]
bill = [min(bill), max(bill)]
2
항상 긴 쪽을 접기
지폐 접기 규칙이 "항상 긴 쪽을 반으로"이므로, 매 반복에서 더 긴 쪽을
//= 2로 접는다. 접은 뒤 다시 정렬하는 이유는 접고 나면 어느 쪽이 더 길어질지 바뀔 수 있기 때문이다. 홀수일 때 //= 2로 버리는 것도 문제의 "홀수면 버림" 규칙과 자연스럽게 일치한다.python
while wallet[0] < bill[0] or wallet[1] < bill[1]:
if bill[0] >= bill[1]:
bill[0] //= 2
else:
bill[1] //= 2
bill = [min(bill), max(bill)]
answer += 1
핵심 인사이트
✓미리
[min, max]로 정렬해 방향 정보를 없애면 "짧은 변 ≤ 짧은 변, 긴 변 ≤ 긴 변"이라는 단일 비교 조건으로 깔끔하게 정리된다. 방향이 있는 문제에서 자주 쓰이는 패턴이다.| 한 줄 회고 | 정렬로 대칭 조건을 없애는 테크닉 — BFS/DFS의 방향 벡터처럼 반복되는 패턴이다 |
menu_book 오늘 공부한 내용
| 학습 주제 | 기초 통계와 데이터 시각화 |
| 참고 자료 | 코드잇 기초 통계와 데이터 시각화 강의 |
| 소요 시간 | 3시간 |
통계란?
아무리 많은 데이터가 있어도 활용하지 못하면 의미 없는 숫자에 불과하다. 통계는 어떤 상황을 쉽게 이해할 수 있도록 숫자를 정리하는 것으로 크게 두 가지로 나뉜다.
기술 통계(Descriptive Statistics) — 많은 양의 데이터를 몇 가지 통계값으로 요약한다. 배달 별점, 야구 타율, 수능 백분위가 대표적인 예다.
추론 통계(Inferential Statistics) — 표본을 기반으로 모집단이 어떠할지 추론한다.
추론 통계(Inferential Statistics) — 표본을 기반으로 모집단이 어떠할지 추론한다.
주요 통계 지표
수치형 데이터에서는 평균·중간값 등을 쓰고, 범주형 데이터(등급·이름 등)에서는 가장 많이 등장하는 값인 최빈값(mode)을 주로 사용한다. 사분위수(Quartile)는 데이터를 순서대로 나열했을 때 4등분하는 지점이다.
describe: "설명하다"
std: standard deviation(표준편차)의 줄임말
quantile: quantity(양)에서 유래 — 전체를 균등하게 나누는 지점
python
import pandas as pd
df = pd.read_csv('test.csv')
# 수치형 데이터만 요약 (std = 표준편차, 학생 이름 등 범주형은 자동 제외)
df.describe()
# 범주형 포함 전체 요약
# unique: 고유값 수 / top: 최빈값 / freq: 최빈값 빈도
df.describe(include='all')

df.describe() — 수치형 컬럼만 요약

df.describe(include='all') — 범주형 포함 전체 요약 (unique=24이면 이름 중복 존재)
평균 vs 중간값
튀는 값(이상점)이 있을 때는 평균이 왜곡될 수 있어 중간값(median)이 더 대표성이 있다. 반면 평점처럼 중간값이 비슷하게 몰릴 수 있는 경우에는 평균(mean)이 더 효과적이다. 상황에 따라 적절하게 선택하는 것이 중요하다.
사분위수를 구할 때 데이터 개수가 짝수이면 선형 보간법을 사용한다. 인덱스 공식은
(n−1) × 백분율이며, 소수 부분은 두 값 사이의 위치 비율을 나타낸다. 예를 들어 n=8이면 Q1 인덱스 = 7×0.25 = 1.75 → 1번과 2번 인덱스 값을 60×0.25 + 74×0.75 = 70.5로 계산한다.박스 플롯(Box Plot)과 이상점 outlier: out(밖) + lier(놓인 것) — 범위 밖에 놓인 값
박스 플롯은 통계 지표의 요약본이다. 박스 중간 선은 중간값(Q2), 박스 아래는 Q1(25%), 박스 위는 Q3(75%)다. IQR(Interquartile Range)은 Q3−Q1로 박스의 높이에 해당하며, 정상 범위인 Whisker는 Q1−1.5×IQR ~ Q3+1.5×IQR이다. 이 범위를 벗어난 점들이 이상점(Outlier)이다.
IQR: Interquartile Range(사분위 범위)
whisker: 수염 — 박스 위아래로 뻗은 선
quantile(0.25): Q1 / quantile(0.75): Q3

박스 플롯 구조 — IQR, Whisker, 이상점
python
import matplotlib.pyplot as plt
school_df = pd.read_csv('data/test_school.csv')
# 단일 컬럼 박스 플롯
school_df['english_score'].plot(kind='box')
plt.show()
# IQR 및 정상 범위 계산
q1 = school_df['english_score'].quantile(0.25)
q3 = school_df['english_score'].quantile(0.75)
iqr = q3 - q1
lower = q1 - 1.5 * iqr # Whisker 하한
upper = q3 + 1.5 * iqr # Whisker 상한
# 전체 컬럼 박스 플롯
school_df.plot(kind='box')
plt.show()

english_score 단일 박스 플롯

전체 컬럼 박스 플롯 비교 — 과학 점수가 전체적으로 높고, 수학은 IQR이 가장 넓어 점수 편차가 크다
히스토그램
연속형 데이터(키, 몸무게 등 딱 떨어지지 않는 값)를 시각화할 때 주로 사용한다. 개별 값이 아니라 구간(bin)으로 묶어서 빈도를 보여준다. 이산형 데이터(나이, 개수 등 딱 떨어지는 값)도 구간을 나눠 히스토그램으로 표현할 수 있다.
bins: bin(통)의 복수형 — 데이터를 담는 구간
python
body_df = pd.read_csv('data/body.csv')
body_df['height'].plot(kind='hist') # 기본 10구간
body_df['height'].plot(kind='hist', bins=7) # 구간 7개로 설정
plt.show()

히스토그램 — 키 분포 (170cm 근처에 집중)
모집단과 표본
모집단(Population)은 원래 파악하고 싶은 전체 집합이고, 표본(Sample)은 모집단에서 뽑아낸 일부다. 기술 통계는 데이터 자체를 요약하고, 추론 통계는 표본을 기반으로 모집단을 추론한다.
확률 밀도 함수와 KDE Plot KDE: Kernel Density Estimation(커널 밀도 추정)
히스토그램은 구간을 임의로 나누기 때문에 연속형 데이터를 세밀하게 파악하기 어렵다. 확률 밀도 함수(PDF: Probability Density Function)는 각 구간이 전체에서 차지하는 비중(확률)을 나타내며, 그래프 아래 전체 넓이는 항상 1이다. 키처럼 연속형 데이터는 정확히 173cm일 확률은 사실상 0이고, 172~174cm 구간에 있을 확률을 넓이로 표현한다.
KDE Plot은 실제 데이터의 분포를 부드럽게 추정해 보여준다.
bw_method(bandwidth)가 작을수록 들쑥날쑥하게 세밀하고, 클수록 부드럽게 단순화된다.
bw_method: bandwidth(대역폭) — 추정의 부드러움 정도
python
body_df['height'].plot(kind='kde') # 기본 KDE
body_df['height'].plot(kind='kde', bw_method=0.1) # 작을수록 들쑥날쑥
body_df['height'].plot(kind='kde', bw_method=1.0) # 클수록 부드럽게 단순화
plt.show()

KDE Plot 기본 — 부드러운 분포 추정

bw_method=0.1 — 세밀하게, 들쑥날쑥

bw_method 큰 값 — 단순화된 분포
데이터 분포의 모양
정규분포(Normal Distribution)는 가운데가 볼록하고 좌우 대칭인 분포다. 중간에 데이터가 몰려 있고 양 끝으로 갈수록 줄어든다.
왜도(Skewness)는 분포가 비뚤어진 정도다. 왜도 < 0이면 왼쪽으로 긴 꼬리(Negatively-skewed), 왜도 > 0이면 오른쪽으로 긴 꼬리(Positively-skewed)다. 첨도(Kurtosis)는 분포가 얼마나 뾰족한지를 나타낸다.

정규분포 — 좌우 대칭, 가운데 볼록

왜도 — Negatively-skewed / 정규분포(왜도=0) / Positively-skewed

첨도 — 낮을 때(납작) / 정규분포 / 높을 때(뾰족)
분산과 표준편차
분산(Variance)은 각 값과 평균의 차이(편차)를 제곱해 평균을 낸 것이다. 제곱하는 이유는 편차를 모두 양수로 통일하고 편차가 큰 값을 더 부각하기 위해서다. 표준편차(Standard Deviation)는 분산에 루트를 씌워 원래 단위로 되돌린 것이다.
분산/표준편차가 작으면 데이터가 평균 근처에 모여 있고, 크면 넓게 퍼져 있다. 표본을 다룰 때는 n−1로 나눈다. Pandas는 기본적으로 n−1, Numpy는 n으로 계산하므로 상황에 맞게 선택하면 된다.
python
body_df['height'].var() # 분산 (Pandas 기본: n-1)
body_df['height'].std() # 표준편차 (Pandas 기본: n-1)
# 모집단 기준으로 계산할 때는 Numpy 사용
import numpy as np
np.var(body_df['height']) # n으로 나눔
np.std(body_df['height']) # n으로 나눔
누적값 계산
cumsum은 cumulative sum(누적합), cumprod는 cumulative product(누적곱)의 줄임말이다. 이전 값이 다음 값에 영향을 주는 경우(복리 계산, 누적 매출 등)에 유용하다.
cumsum = cumulative + sum(합)
cumprod = cumulative + product(곱)
python
store_df = pd.read_csv('data/revenue.csv')
store_df['revenue'].cumsum() # 누적합 — 월별 매출을 누적해서 볼 때
interest_df = pd.read_csv('data/interest.csv')
interest_df['multiple'] = interest_df['interest'] + 1 # 이자율이라 1을 미리 더함
interest_df['multiple'].cumprod() # 누적곱 — 복리 계산에 활용
오늘의 키포인트
1박스 플롯 하나에 Q1·Q2·Q3·IQR·이상점이 전부 담겨 있다. Whisker 범위(Q1−1.5×IQR ~ Q3+1.5×IQR)를 벗어나면 이상점이다.
2KDE Plot의
bw_method가 작을수록 세밀하고 들쑥날쑥, 클수록 부드럽고 단순화된다. 히스토그램보다 연속형 데이터를 세밀하게 파악할 수 있다.3Pandas
var()/std()는 기본적으로 n−1(표본 기준), Numpy는 n(모집단 기준)으로 계산한다. 상황에 맞게 선택해야 한다.psychology 오늘 들었던 생각
함수명들이 대부분 영어 단어 그대로라는 걸 느꼈다. cumsum은 cumulative sum, cumprod는 cumulative product, describe는 말 그대로 "설명하다", quantile은 "양을 나누다" — 영어 단어 뜻만 알면 함수가 뭘 하는지 자연스럽게 유추가 된다. 억지로 외우려 하지 않아도 단어 자체가 힌트가 되는 게 파이썬의 장점인 것 같다.
rate_review 마무리
통계 기초까지 — 데이터를 숫자로만 보는 게 아니라 시각적으로 해석하는 눈이 생긴 하루.
checklist 내일 할 일
- 프로그래머스 문제 한 개 풀기
- 기초 통계와 데이터 시각화 이어서 듣기
반응형
'AI' 카테고리의 다른 글
| [D-3] 시각화 도구 3종 비교 (0) | 2026.06.29 |
|---|---|
| [D-4] seaborn으로 상관관계 보기 (0) | 2026.06.28 |
| [D-6] DataFrame 인덱싱 헷갈리는 포인트 정리 (1) | 2026.06.26 |
| [D-7] Numpy, Pandas, Matplotlib 한 번에 훑기 (0) | 2026.06.25 |
| [D-8] 코드잇 스프린트 시작 전, 파이썬 워밍업 (0) | 2026.06.24 |
