[D-7] Numpy, Pandas, Matplotlib 한 번에 훑기

2026. 6. 25. 18:50·AI
반응형
edit_note 오늘 코테 문제
문제 붓기 (Lv.1)
플랫폼 프로그래머스
난이도 Lv. 1
핵심 요구사항 아직 안 칠한 구역 중 가장 왼쪽부터 롤러를 출발시켜 최소 횟수 구하기
python
def solution(n, m, section):
    answer = 1
    painted = section[0] + m - 1

    for s in section[1:]:
        if s > painted:
            answer += 1
            painted = s + m - 1

    return answer
시간복잡도 O(N) — section을 한 번만 순회
풀이 접근법
이 문제의 핵심은 아직 안 칠한 구역 중 가장 왼쪽을 발견했을 때 거기서 롤러를 출발시키는 게 항상 최선이라는 점이다. 롤러를 왼쪽 끝에 맞춰 출발시켜야 오른쪽으로 최대한 많이 커버할 수 있기 때문이다.
1
첫 롤러 출발 및 painted 초기화
section[0]은 무조건 칠해야 하므로 첫 롤러는 여기서 출발한다. 롤러 길이가 m이므로 section[0] ~ section[0]+m-1 범위가 한 번에 칠해진다. 이 오른쪽 끝을 painted로 기록해두면 이후 O(1)로 커버 여부를 판단할 수 있다.
python
answer = 1
painted = section[0] + m - 1
 
2
나머지 section 순회
section을 왼쪽부터 순서대로 보면서 painted와 비교한다. 이미 칠해진 범위 안이면 스킵, 범위를 벗어나면 새 롤러를 출발시키고 painted를 갱신한다.
python
for s in section[1:]:
    if s > painted:
        answer += 1
        painted = s + m - 1
s painted 판단
2 2+4-1 = 5 첫 롤러 출발
3 5 3 ≤ 5 → 스킵
6 5 6 > 5 → 롤러 출발, painted = 9
→ answer = 2 ✅
왜 painted 변수 하나로 충분한가
✓매 구역마다 롤러를 새로 출발시키면 이미 칠해진 구역을 다시 확인해야 하지만, painted로 오른쪽 끝만 추적하면 각 section을 O(1)로 판단할 수 있다.
한 줄 회고 그리디의 핵심 — 현재 시점의 최선(왼쪽 끝 출발)이 전체 최적을 보장한다는 걸 증명하고 나면 코드가 단순해진다
 
menu_book 오늘 공부한 내용
학습 주제 데이터 사이언스 Toolkit — Jupyter Notebook, Numpy, Matplotlib, Pandas
참고 자료 코드잇 데이터 사이언스 Toolkit
소요 시간 5 시간
Jupyter Notebook
데이터 분석 과정을 기록하는 공책 같은 역할. 코드를 나눠서 순차적으로 실행하고 누적해서 볼 수 있으며, 셀들 간에 변수를 공유한다(같은 커널 내). 주요 단축키는 실행 Shift+Enter, 위에 셀 추가 a, 아래에 셀 추가 b. 셀 왼쪽 숫자가 실행 순서를 나타내며, 셀이 어디 있든 실행 순서대로 동작하므로 순서대로 배치하는 게 좋다. Python 형식 외에 마크다운 형식으로 설명글도 작성할 수 있다.
Numpy
Numerical Python의 줄임말. Python list보다 간결하고 단체 연산에 용이하며, 내부적으로 C언어로 최적화되어 있어 속도가 매우 빠르다. 메모리 최적화와 연산 최적화가 되어 있고, numpy array 기반 라이브러리가 많아 호환성이 좋다.
python
import numpy as np

# 배열 생성
array1 = np.array([1, 3, 5, 6, 7, 9])
np.zeros(5)           # 0이 5개
np.arange(10)         # 0~9
np.arange(4, 17, 3)   # 4부터 16까지 3씩

# 배열 정보
array1.size           # 원소 개수
array1.shape          # 정확한 모양 (6,)

# 1차원 인덱싱
gdp_array = np.array([6610, 7637, 8127, 8885, 10385, 12565, 13403, 12398, 8282, 10672])
gdp_array[0]          # 6610
gdp_array[-1]         # 10672 (마지막)
gdp_array[[1, 3, 4]]  # 1, 3, 4 인덱스 값
gdp_array[2:6]        # 슬라이싱
gdp_array[1:8:3]      # 1부터 7까지 3씩

# 2차원 인덱싱
gdp_2d = np.array([
    [12257, 11561, 13165, 14673, 16496, 19403],  # 대한민국
    [39169, 34406, 32821, 35387, 38299, 37813],  # 일본
    [959,   1053,  1149,  1289,  1509,  1753 ],  # 중국
    [36335, 37133, 38023, 39496, 41713, 44115]   # 미국
])
gdp_2d[1, 3]          # 35387
gdp_2d[1:3, 2:5]      # 일본·중국의 2002~2004
gdp_2d[:, 2:5]        # 모든 국가의 2002~2004

# 불린 인덱싱
mask = gdp_array > 10000
gdp_array[mask]                              # 10000 초과 값
gdp_array[(gdp_array > 10000) | (gdp_array < 8000)]  # or 조건

# 기본 연산
gdp_array.mean()      # 평균
gdp_array.sum()       # 합
gdp_array.min()       # 최솟값
gdp_array.max()       # 최댓값
gdp_array * 1200      # 전체 원소에 곱하기 (원본 변경 없음)
gdp_us - gdp_korea    # 각 위치 원소끼리 빼기
Matplotlib
데이터를 시각화하는 라이브러리. 많은 값들이 흩어져 있을 때 그래프로 정리하면 패턴을 볼 수 있고 효과적으로 인사이트를 얻을 수 있다. Python과 Numpy 기반이다.
python
import matplotlib.pyplot as plt

# 꺾은선 그래프
plt.plot(year_array, stock_array)
plt.show()
꺾은선 그래프 (plt.plot)
python
# 막대 그래프
plt.bar(name_array, votes_array)
plt.show()
막대 그래프 (plt.bar)
python
# 산점도 — 두 변수의 연관성 파악
plt.scatter(height_array, weight_array)
plt.show()

# 스타일 + 레이블 추가
plt.scatter(height_array, weight_array, c='red', marker='+')
plt.title('Height and Weight')
plt.xlabel('Height (cm)')
plt.ylabel('Weight (kg)')
plt.show()

# 그래프 크기 설정
plt.figure(figsize=(10, 4))
plt.rcParams['figure.figsize'] = (5, 5)  # 전역 설정

# 한글 폰트 (Mac)
plt.rc('font', family='Apple Gothic')    # Windows: Malgun Gothic
산점도 (plt.scatter) — 기본
산점도 — 색상·마커·레이블 적용
Pandas
표 형태의 데이터를 간편하게 다루는 데이터 분석 라이브러리. Numpy만으로는 가독성이 떨어지고 한 가지 데이터 타입만 넣을 수 있는데, Pandas는 이 문제들을 모두 해결한다. 데이터를 쉽게 불러와서 가공·분석·시각화할 수 있다.
python
import pandas as pd

# DataFrame 생성
df = pd.DataFrame({
    'category': ['skirt', 'sweater', 'coat', 'jeans'],
    'quantity': [10, 15, 6, 11],
    'price':    [30000, 60000, 95000, 35000]
})

# 컬럼 연산 (Numpy 기능 활용)
df['quantity'].mean()
df['quantity'].sum()
df['quantity'] * df['price']  # 인덱스끼리 곱한 새 Series 반환
DataFrame 기본 출력
python
# CSV 불러오기
pd.read_csv("data/burger.csv")
# 헤더 없는 경우
pd.read_csv("data/burger2.csv", header=None,
            names=['product_name', 'calories', 'carb', 'protein', 'fat', 'sodium', 'category'])
# 인덱스 지정
pd.read_csv("data/burger.csv", index_col="product_name")
CSV 불러오기 — 헤더 있는 경우
index_col로 product_name을 인덱스로 설정
python
# iloc / loc
burger_df.iloc[3, 1]                                  # 정수 위치로 접근
burger_df.iloc[[2, 3], [1, 2]]
burger_df.loc['Double Whopper', 'protein']            # 이름으로 접근
burger_df.loc[['Whopper', 'Double Whopper'], ['carb', 'protein', 'fat']]

# 불린 인덱싱
burger_df.loc[burger_df['calories'] < 500]
mask = burger_df['calories'] < 500
burger_df.loc[mask, 'calories':'fat']

# 값 수정 / 추가
burger_df.loc['Double Stacker King', 'sodium'] = 1.9
burger_df.loc['Triple Whopper'] = [1130, 49, 67, 75, 1.1, 'Burger']  # row 추가
burger_df.loc[burger_df['calories'] >= 500, 'high_calorie'] = True    # 컬럼 추가

# 타입 변환
burger_df = burger_df.astype({'calories': 'Float64', 'carb': 'Float64'})
불린 마스킹으로 high_calorie 컬럼 추가
# DataFrame으로 그래프 그리기
sales_df.plot(x='quarter', y='revenue')
plt.show()

sales_df.plot(x='quarter', y='revenue', kind='bar')   # 막대
sales_df.plot(y='revenue', kind='pie',
              labels=['1Q', '2Q', '3Q', '4Q'])         # 파이차트
plt.show()
sales_df.plot() — 꺾은선
kind='pie' — 파이차트
오늘의 키포인트
1Numpy — Python list보다 단체 연산이 훨씬 빠르다. 내부가 C로 최적화되어 있고 불린 인덱싱으로 조건 필터링이 깔끔하다.
2Pandas iloc은 정수 위치, loc은 이름 기반 접근. 조건 필터링은 df.loc[mask, 컬럼] 패턴으로 행·열을 동시에 지정할 수 있다.
3DataFrame에서 .plot()을 바로 호출하면 Matplotlib 없이도 간단히 그래프를 그릴 수 있다. kind 파라미터로 그래프 종류를 바꾼다.
 
psychology 오늘 들었던 생각

Numpy·Pandas·Matplotlib가 각각 따로 존재하지 않고 서로 기반을 쌓아가며 연결된다는 게 흥미로웠다. Swift의 Collection 타입 연산이랑 비슷한 느낌인데 문법이 훨씬 간결해서 데이터 탐색할 때 생각의 흐름이 끊기지 않는다는 게 장점인 것 같다.

 
rate_review 마무리
데이터 사이언스의 기본 3종 세트(Numpy, Matplotlib, Pandas)를 한 번에 훑었다. 각 라이브러리의 역할과 연결 관계가 잡힌 하루.
 
checklist 내일 할 일
  •  
    프로그래머스 문제 한 개 풀기
  •  
    데이터 사이언스 Toolkit 복습
  •  
    기초 통계와 데이터 시각화 듣기
반응형

'AI' 카테고리의 다른 글

[D-3] 시각화 도구 3종 비교  (0) 2026.06.29
[D-4] seaborn으로 상관관계 보기  (0) 2026.06.28
[D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지  (0) 2026.06.27
[D-6] DataFrame 인덱싱 헷갈리는 포인트 정리  (1) 2026.06.26
[D-8] 코드잇 스프린트 시작 전, 파이썬 워밍업  (0) 2026.06.24
'AI' 카테고리의 다른 글
  • [D-4] seaborn으로 상관관계 보기
  • [D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지
  • [D-6] DataFrame 인덱싱 헷갈리는 포인트 정리
  • [D-8] 코드잇 스프린트 시작 전, 파이썬 워밍업
Riu
Riu
안녕하세요 iOS 개발자를 꿈꾸는 Riu입니다. Github: woolnd
  • Riu
    Riu 개발노트
    Riu
  • 전체
    오늘
    어제
    • 분류 전체보기 (45) N
      • AI (17) N
      • iOS 개발 (21)
        • SwiftUI (9)
        • UIKit (6)
        • Combine (5)
        • Architecture (1)
      • 알고리즘 (1)
      • 회고록 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    코드잇스프린트잇
    AI부트캠프
    AI엔지니어
    코드잇스프린트
    앗차!
    figma
    UIKit
    막자알림서비스
    ios
    회고록
    Combine
    cleanArchitecture
    SWIF
    AI엔지니어취업
    구름톤유니브
    ios개발
    Ai
    SWIFT
    나만의todo
    SwiftUI
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Riu
[D-7] Numpy, Pandas, Matplotlib 한 번에 훑기
상단으로

티스토리툴바