[D-3] 시각화 도구 3종 비교

2026. 6. 29. 15:00·AI
반응형
edit_note 오늘 코테 문제
문제개인정보 수집 유효기간 (Lv.1)
플랫폼프로그래머스
난이도Lv. 1
핵심 요구사항수집일 + 약관 유효기간이 오늘 이하인 개인정보 번호를 오름차순으로 반환
내가 작성한 코드
python
def solution(today, terms, privacies):
    answer = []

    ty, tm, td = today.split('.')
    today_days = (int(ty) * 12 * 28) + (int(tm) * 28) + int(td)

    term_dict = {}
    for term in terms:
        term_split = term.split()
        term_dict[term_split[0]] = int(term_split[1]) * 28

    for index, privacy in enumerate(privacies, 1):
        privacy_split = privacy.split()
        y, m, d = map(int, privacy_split[0].split('.'))
        days = (y * 12 * 28) + (m * 28) + d
        days += term_dict[privacy_split[1]]

        if today_days >= days:
            answer.append(index)

    return answer
시간복잡도O(N) — terms 전처리 + privacies 순회
풀이 접근법
이 문제의 핵심은 날짜 비교를 직접 하지 않고, 모든 날짜를 단일 정수(일수)로 변환하는 것이다. 월/년 경계 처리를 고민하면 복잡해지지만, "모든 달은 28일" 조건을 활용해 스칼라로 펼치면 단순한 대소 비교로 줄어든다.
1
날짜를 일수 스칼라로 변환
모든 달이 28일이므로 연도 × 12 × 28 + 월 × 28 + 일 공식으로 단일 정수에 매핑할 수 있다. 이렇게 하면 날짜 간의 대소 비교가 숫자 비교 하나로 단순화된다.
python
ty, tm, td = today.split('.')
today_days = (int(ty) * 12 * 28) + (int(tm) * 28) + int(td)
2
약관을 딕셔너리로 전처리
매 개인정보마다 약관을 선형 탐색하면 비효율적이다. 미리 딕셔너리로 구성해두면 약관 종류로 O(1) 조회가 가능하다. 유효기간도 이 시점에 달 수 × 28로 일수 변환해둔다.
python
term_dict = {}
for term in terms:
    term_split = term.split()
    term_dict[term_split[0]] = int(term_split[1]) * 28
3
만료일 계산 후 오늘과 비교
수집일을 일수로 변환하고 유효기간 일수를 더하면 만료일이 된다. today_days >= days인 이유는 days가 파기 시작일이기 때문이다. 마지막 보관 가능한 날은 days - 1이고, 오늘이 days 당일이면 이미 파기해야 한다.
python
for index, privacy in enumerate(privacies, 1):
    privacy_split = privacy.split()
    y, m, d = map(int, privacy_split[0].split('.'))
    days = (y * 12 * 28) + (m * 28) + d
    days += term_dict[privacy_split[1]]

    if today_days >= days:
        answer.append(index)
고도화
날짜 변환 로직을 to_days() 함수로 분리하고, 필터링을 리스트 컴프리헨션으로 인라인 처리해 중간 변수와 append를 완전히 없앴다. 약관 딕셔너리도 딕셔너리 컴프리헨션으로 한 줄 처리했다.
✦ 고도화된 코드
python
def solution(today, terms, privacies):
    def to_days(date):
        y, m, d = map(int, date.split('.'))
        return y * 12 * 28 + m * 28 + d

    today_days = to_days(today)
    term_dict = {t.split()[0]: int(t.split()[1]) * 28 for t in terms}

    return [
        i for i, p in enumerate(privacies, 1)
        if today_days >= to_days(p.split()[0]) + term_dict[p.split()[1]]
    ]
리스트 컴프리헨션이란?
리스트를 만드는 파이썬 전용 축약 문법이다. [표현식 for 변수 in 반복가능객체 if 조건] 구조로, 일반 for문 + append 패턴을 한 줄로 줄여준다.
python
# 일반 for문
result = []
for i in range(5):
    if i % 2 == 0:
        result.append(i * 2)

# 리스트 컴프리헨션 — 동일한 결과
result = [i * 2 for i in range(5) if i % 2 == 0]
# → [0, 4, 8]
이 문제에서는 아래 두 가지를 컴프리헨션으로 고도화했다.
① append 없이 조건 필터링을 인라인으로 — if 조건을 컴프리헨션 안에 넣어서 answer.append(index) 자체가 필요 없어진다.
② 약관 딕셔너리도 딕셔너리 컴프리헨션으로 — {key: value for ...} 구조로 for문 + 대입을 한 줄로 처리했다.
전: 3줄짜리 날짜 변환 → 후: to_days() 한 번 호출 / 전: append 반복 → 후: 컴프리헨션 인라인 필터링
핵심 인사이트
✓날짜 비교를 직접 하지 않고 단일 정수로 변환하면 경계 처리가 사라진다. "모든 달 28일" 조건이 이를 가능하게 한다.
✓반복되는 변환 로직은 함수로 분리하면 코드가 훨씬 읽기 쉬워진다. to_days() 하나로 today, 수집일 모두 처리 가능하다.
한 줄 회고날짜를 숫자로 펼치는 발상 — 복잡한 조건을 단순한 대소 비교로 줄이는 게 핵심이었다
menu_book 오늘 공부한 내용
학습 주제plt / df.plot / Seaborn 비교 정리
참고 자료코드잇 기초 통계와 데이터 시각화 강의
소요 시간2시간
plt / df.plot / Seaborn — 언제 뭘 쓸까
세 가지 모두 Matplotlib 기반이지만 추상화 수준이 다르다. plt는 가장 세밀한 제어가 가능하고, df.plot은 DataFrame에서 빠르게 시각화할 때, Seaborn은 통계 시각화에 특화되어 있다.
항목matplotlib.pyplotdf.plotseaborn
기반Matplotlib 자체Matplotlib 래퍼Matplotlib 래퍼 (고수준)
추상화낮음 — 세부 제어 직접중간높음 — 통계 시각화 특화
데이터 입력plt.plot(x, y)df.plot(x='col', y='col')sns.lineplot(data=df, x=..., y=...)
그룹/색상반복문으로 직접 처리by= 파라미터hue= 한 줄 자동 처리
장점자유도 최고, 어떤 커스터마이징도 가능DataFrame에서 바로 호출, 간결통계 그래프 간단하게, 기본 스타일 예쁨
단점코드 길어짐, 반복 많음고급 옵션은 결국 plt 혼용 필요세밀한 제어는 plt/ax 직접 접근 필요
주로 쓰는 때복잡한 레이아웃, 세부 커스텀빠른 EDA, DataFrame 구조 그대로분포·상관·회귀 등 통계 시각화, 발표용
그래프별 지원 현황
그래프pltdf.plotseaborn용도
lineplt.plot()kind='line'sns.lineplot()시계열·추세
barplt.bar()kind='bar'sns.barplot()범주형 값 비교
scatterplt.scatter()kind='scatter'sns.scatterplot()두 변수 관계
histogramplt.hist()kind='hist'sns.histplot()단일 변수 분포
boxplotplt.boxplot()kind='box'sns.boxplot()중앙값·IQR·이상치
kdeplot❌ scipy 별도kind='kde'sns.kdeplot()부드러운 분포
stripplotscatter + 수동 jitter❌sns.stripplot()범주형 산점도
swarmplot❌ 직접 구현 복잡❌sns.swarmplot()점 겹침 없는 산점도
violinplot❌❌sns.violinplot()분포 + 밀도 동시
heatmap❌❌sns.heatmap()상관행렬 시각화
regplot❌❌sns.regplot()회귀선 자동 추가
pairplot❌❌sns.pairplot()변수 쌍 전체 비교
오늘의 키포인트
1날짜처럼 복잡한 비교 조건은 단일 정수로 변환해버리면 경계 처리가 사라진다. 반복되는 변환은 함수로 분리하면 코드가 훨씬 깔끔해진다.
2plt·df.plot·seaborn은 모두 Matplotlib 기반이다. 빠른 탐색엔 df.plot, 통계 시각화엔 seaborn, 세밀한 커스텀엔 plt를 쓰면 된다.
3violinplot·heatmap·regplot·pairplot처럼 통계 특화 그래프는 seaborn에만 있다. 이런 그래프가 필요할 때는 seaborn이 유일한 선택이다.
psychology 오늘 들었던 생각

날짜를 숫자로 변환해 비교한다는 발상이 인상적이었다. 복잡해 보이는 문제도 표현 방식을 바꾸면 단순해진다는 걸 느꼈다. plt·df.plot·seaborn을 비교하면서 세 가지가 각자 역할이 다르다는 걸 정리할 수 있었다. 뭘 쓸지 고민하지 않고, 상황에 따라 바로 선택할 수 있도록 표로 만들어두길 잘한 것 같다.

rate_review 마무리
문제를 단순화하는 발상 + 시각화 도구 정리 — 도구를 이해하고 쓰는 것과 그냥 쓰는 것의 차이가 있다는 걸 느낀 하루.
checklist 내일 할 일
  • 프로그래머스 문제 한 개 풀기
반응형

'AI' 카테고리의 다른 글

[D-1] 코드잇 스프린트 환영회  (0) 2026.07.01
[D-2] 코테 한 문제, 그리고 잠시 숨 고르기  (0) 2026.06.30
[D-4] seaborn으로 상관관계 보기  (0) 2026.06.28
[D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지  (0) 2026.06.27
[D-6] DataFrame 인덱싱 헷갈리는 포인트 정리  (1) 2026.06.26
'AI' 카테고리의 다른 글
  • [D-1] 코드잇 스프린트 환영회
  • [D-2] 코테 한 문제, 그리고 잠시 숨 고르기
  • [D-4] seaborn으로 상관관계 보기
  • [D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지
Riu
Riu
안녕하세요 iOS 개발자를 꿈꾸는 Riu입니다. Github: woolnd
  • Riu
    Riu 개발노트
    Riu
  • 전체
    오늘
    어제
    • 분류 전체보기 (43) N
      • AI (15) N
      • iOS 개발 (21)
        • SwiftUI (9)
        • UIKit (6)
        • Combine (5)
        • Architecture (1)
      • 알고리즘 (1)
      • 회고록 (5)
  • 블로그 메뉴

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

    • Github
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Riu
[D-3] 시각화 도구 3종 비교
상단으로

티스토리툴바