Today I Learned

[내일배움캠프 QA/QC 6기] TIL #018

JiJi0406 2026. 6. 5. 20:26

 

001

오늘의 코드카타

(27) 프로그래머스 [Python] Lv.1 핸드폰 번호 가리기

 

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 * 으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

 

제한 조건

  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

 

입출력 예

phone_number return
"01033334444" "*******4444"
"027778888" "*****8888"

 


 

내가 푼 방법 👇👇👇

더보기

문제를 보자마자 습관적으로 for문을 써서 풀어야겠다고 생각했다.

그래서 for문을 사용해 코드를 다 작성하고, 실행까지 잘 되어서 당연히 맞을 줄 알았는데... 제출하니까 또 실패!! 🤯

어떤 부분에서 오류가 있었는지 정리해보자... (>人<;)

 

1. 문제가 발생한 코드

def solution(phone_number):
    answer = ''
    for i in phone_number:
        if i in phone_number[:-4]:  # ⚠️ 문제의 구간
            answer += '*'
        else:
            answer += i
    return answer

 

2. 원인 분석

if i in phone_number[:-4]: 조건문이 '인덱스(위치)'를 비교하는 게 아니라, '글자 자체의 포함 여부'를 체크하기 때문!

  • 정상 작동 케이스 ("01033334444")
    • phone_number[:-4]는 "0103333"이 됨.
    • 뒤의 진짜 4자리인 "4444"를 돌 때, 4라는 글자는 앞의 "0103333"에 없으므로 else문으로 빠져서 4444가 그대로 잘 출력됨.
  • 오류 발생 케이스 ("01044444444")
    • phone_number[:-4]는 "0104444"가 됨.
    • 뒤의 진짜 4자리인 "4444"를 돌 때, 4라는 글자가 앞의 "0104444"에 이미 포함되어 있음 (in 조건 참).
    • 결국 뒷자리인데도 전부 *로 바뀌어 버려서 ***********이 리턴됨.

결론: 문자열에서 특정 '위치'를 기준으로 로직을 짜야 할 때는 값 자체를 비교하는 in 연산자를 쓰면 XXX

 

3. 해결 방법

굳이 반복문을 돌릴 필요 없이, 문자열 곱하기(*)와 슬라이싱을 이용해 한 줄로 끝낼 수 있다.

def solution(phone_number):
    # 뒷 4자리를 제외한 길이만큼 *을 만들고, 실제 뒷 4자리를 붙여줌
    return '*' * (len(phone_number) - 4) + phone_number[-4:]

 

이렇게 간단한 걸 복잡하게 하고 있었네 또...

 

문제 초기 상태에 저렇게 빈 문자열 answer이 있어서 당연히 for문 써야지하는 편협한 생각을 하게 된 것 같음...^^ (변명 맞음)

 


 

002

오늘 학습한 내용

 

📝 어제 들었던 라이브 세션 내용 다시 정리

 

1. Seaborn 라이브러리

Matplotlib이 그래프를 한 땀 한 땀 그리는 도구라면, Seaborn은 알아서 예쁘게 그려주는 고수준의 라이브러리다.

판다스 데이터프레임을 통째로 넘기면 알아서 집계까지 처리해 준다!!

import seaborn as sns
import matplotlib.pyplot as plt

# 깔끔한 분석용 그래프를 위한 테마 지정
sns.set_theme(style="whitegrid")

 

톤앤매너 맞추기의 중요성
그래프 시각화할 때 색상 신경 써서 만들 필요가 있음. 강조하는 곳엔 진하게, 아닌 곳은 연하게 다뤄야 한다. 이번 프로젝트할 때 데이터 시각화를 할 텐데, 신경써서 만들어보자
  • 범주형(요일, 성별): Set2, pastel, husl, deep
  • 연속형(금액, 점수): viridis, coolwarm, Blues

 

▼ Seaborn 주요 메서드 및 파라미터 모아보기

메서드 용도 및 특징 핵심 파라미터
sns.countplot() 범주형 데이터의 빈도(개수) 계산

(Pandas의 value_counts 대체)
data=df, x='컬럼명'
sns.barplot() 범주형 데이터의 평균(Mean) 시각화

(Pandas의 groupby 대체, 막대 위 선은 신뢰구간)
data=df, x='범주형', y='연속형'
sns.scatterplot() 두 연속형 변수 간의 관계 확인 data=df, x='x축', y='y축'

• hue: 그룹별 색상 구분

• style: 그룹별 마커 모양 구분

• size: 데이터 값에 따른 점 크기
sns.boxplot() 데이터의 5대 요약 수치 및 이상치 탐색 data=df, x='범주형', y='연속형', palette='Set2'
sns.violinplot() 데이터의 오분포 및 밀도 확인 split=True (hue 지정 시 두 그룹을 반으로 쪼개서 합쳐줌)
sns.heatmap() 히트맵 생성은 matplotlib보다 seaborn이 훨씬 편하다!
변수 간 상관관계를 색상으로 표현
data=corr, annot=True (수치 표시), fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1
sns.pairplot() 모든 숫자형 변수의 관계를 그리드로 한눈에 출력 data=df (데이터가 너무 크면 노트북이 멈추니 조심하자)
sns.lmplot() 산점도 위에 추세선과 신뢰구간을 자동으로 그려줌 data=df, x='x축', y='y축'
sns.jointplot() 산점도와 히스토그램을 합쳐 관계와 분포를 동시에 보여줌 data=df, x='x축', y='y축'
sns.swarmplot() 모든 데이터를 점으로 찍되 겹치지 않게 옆으로 펼침 (데이터 양이 적을 때 분포 보기 최적) data=df, x='범주형', y='연속형'

 

+

Faceting (그래프 쪼개기) 기능

Matplotlib처럼 subplot 위치를 일일이 계산할 필요 없이, catplot이나 relplot에서 col='컬럼명' 옵션만 주면 알아서 요일별/그룹별로 그래프를 쪼개서 그려준다!

 

Seaborn: col 옵션 (Catplot/Relplot)

    col='day',       # 핵심: 요일별로 쪼개기
    col_wrap=2,      # 한 줄에 2개씩 배치

 

2. Plotly 라이브러리

정적인 그래프를 넘어 마우스를 올리면 상세 정보가 뜨고, 범례를 클릭하면 데이터를 껐다 켤 수 있는 인터랙티브(반응형) 차트

(주의: plt.show() 대신 fig.show()를 사용함)

 

①  반응형 산점도: 마우스 호버 시 상세 데이터 확인 가능.

  계층 구조 시각화 (트리맵 & 선버스트): "어떤 요일에, 어떤 시간대에, 누가 돈을 많이 썼나?"와 같은 계층형 데이터를 시각화할 때 씀.

  • 시각화는 직관적이어야 하는데, 선버스트 같은 건 직관적이지 못해서 실무에서는 잘 안 씀

③ 애니메이션 차트: 특정 변수(ex. 인원수)가 늘어남에 따라 데이터가 어떻게 변하는지 시간에 따른 흐름처럼 동적으로 관찰 가능.

 

 

3. 데이터 분석 꿀팁 라이브러리 (Auto-EDA)

복잡하게 코드 안 짜고 데이터셋 던져주면 알아서 전반적인 상태를 분석해 주는 치트키 도구들!

 

① YData Profiling (구 Pandas Profiling)

  • 특징: 가장 유명한 EDA 자동화 라이브러리. 결측치, 이상치, 변수 분포, 상관관계, 중복 데이터, 통계 요약을 코드 3줄로 요약해 줌
  • 장점: HTML 리포트로 결과물을 뽑아줘서 실무 데이터 품질 점검용으로 요긴

② Sweetviz

  • 특징: 시각화 결과물이 깔끔하고 직관적
  • 장점: 특정 타겟 변수(ex. 'tip')를 지정해서 분석하는 기능이 강력하며, 머신러닝 전 데이터 탐색에 적합
 

③ PyGWalker

  • 특징: 주피터 노트북이나 코랩 환경 안에서 Tableau(태블로) 스타일의 인터페이스를 띄워줌.
  • 장점: 코드 한 줄 안 쓰고 마우스 드래그 앤 드롭만으로 온갖 차트를 실시간으로 만들어낼 수 있음!! 빠른 데이터 탐색이 필요하거나 시각화 코드가 귀찮을 때 직방

++

실력이 언제 확 늘까? 바로 프로젝트 하면서.
데이터셋 결측치, 이상치를 어떻게 처리하고, 어떻게 시각화할지 고민하고, 어떤 주장을 할지 생각해보고, 튜터님들한테 질문해보고, 팀원들이랑 의견 조율해보고... 지금껏 배운 이론 내용 바탕으로 프로젝트를 진행하다보면 실력이 늘 것이라고 하셨다.

 

다음주부터 들어가는 기초 프로젝트 화이팅해보자ㅏㅏ💪

 

 


 

[아티클 스터디]

양질의 데이터를 판별할 때, 데이터의 양이나 형식도 기준이 될 수 있지만 더 중요한 건 그 데이터가 원하는 정보를 담고 있는지, 사용하려는 분석 방법과 맞는지를 살펴보는 것.

DIKW 피라미드(Data→Information→Knowledge→Wisdom)가 보여주듯, 데이터에서 의미 있는 지혜를 끌어내려면 각 단계를 차례로 거쳐야 함. 분석하려는 내용이 애초에 데이터 안에 없다면 붙잡고 있기보다 저품질로 판단하고 다른 데이터를 찾는 편이 효율적.

동일한 데이터라도 분석가의 역량에 따라 양질 여부가 달라질 수 있다.

분석 방법별로 요구되는 데이터 조건
  • 머신러닝: 데이터 양(양도 물론 중요)보다 종속 변수(예측 대상값)의 존재 여부를 봐야 함. 종속 변수가 없으면 학습 자체가 불가능
  • 인사이트 도출 : 원천 데이터보다 비율, 평균, 지수처럼 가공된 형태가 더 유리. 복잡한 데이터를 하나의 수치로 압축했을 때 오히려 새로운 발견이 가능 (ex. 코스피 지수)

 

결론: 분석 목적이 불명확하면 데이터 품질을 논하는 것 자체가 무의미하다

 

 


+

 

퀴즈 3등했습니다. TIL에 정리하면서 그날 학습한 거 바로바로 다시 복습한 게 좀 도움이 된 듯 ㅎㅎ

 

#mood