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:]
이렇게 간단한 걸 복잡하게 하고 있었네 또...


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(태블로) 스타일의 인터페이스를 띄워줌.
- 장점: 코드 한 줄 안 쓰고 마우스 드래그 앤 드롭만으로 온갖 차트를 실시간으로 만들어낼 수 있음!! 빠른 데이터 탐색이 필요하거나 시각화 코드가 귀찮을 때 직방
++
실력이 언제 확 늘까? 바로 프로젝트 하면서.
데이터셋 결측치, 이상치를 어떻게 처리하고, 어떻게 시각화할지 고민하고, 어떤 주장을 할지 생각해보고, 튜터님들한테 질문해보고, 팀원들이랑 의견 조율해보고... 지금껏 배운 이론 내용 바탕으로 프로젝트를 진행하다보면 실력이 늘 것이라고 하셨다.
다음주부터 들어가는 기초 프로젝트 화이팅해보자ㅏㅏ💪

[아티클 스터디]
- 주제 : 양질의 데이터를 판별하는 5가지 방법: ⑤ 목적에 적합한 데이터인가?
- 아티클 링크 : https://yozm.wishket.com/magazine/detail/1123/
- 요약 :
양질의 데이터를 판별할 때, 데이터의 양이나 형식도 기준이 될 수 있지만 더 중요한 건 그 데이터가 원하는 정보를 담고 있는지, 사용하려는 분석 방법과 맞는지를 살펴보는 것.
DIKW 피라미드(Data→Information→Knowledge→Wisdom)가 보여주듯, 데이터에서 의미 있는 지혜를 끌어내려면 각 단계를 차례로 거쳐야 함. 분석하려는 내용이 애초에 데이터 안에 없다면 붙잡고 있기보다 저품질로 판단하고 다른 데이터를 찾는 편이 효율적.
동일한 데이터라도 분석가의 역량에 따라 양질 여부가 달라질 수 있다.
분석 방법별로 요구되는 데이터 조건
- 머신러닝: 데이터 양(양도 물론 중요)보다 종속 변수(예측 대상값)의 존재 여부를 봐야 함. 종속 변수가 없으면 학습 자체가 불가능
- 인사이트 도출 : 원천 데이터보다 비율, 평균, 지수처럼 가공된 형태가 더 유리. 복잡한 데이터를 하나의 수치로 압축했을 때 오히려 새로운 발견이 가능 (ex. 코스피 지수)
결론: 분석 목적이 불명확하면 데이터 품질을 논하는 것 자체가 무의미하다
+


'Today I Learned' 카테고리의 다른 글
| [내일배움캠프 QA/QC 6기] TIL #020 (0) | 2026.06.09 |
|---|---|
| [내일배움캠프 QA/QC 6기] TIL #019 기초 프로젝트 start (0) | 2026.06.08 |
| [내일배움캠프 QA/QC 6기] TIL #017 직접 해보기 (0) | 2026.06.04 |
| [내일배움캠프 QA/QC 6기] TIL #016 ✨데이터 시각화 (with Matplotlib)✨ (1) | 2026.06.02 |
| [내일배움캠프 QA/QC 트랙 6기 본캠프] TIL #015 데이터 전처리 & 시각화 (0) | 2026.06.01 |