001
오늘의 코드카타
(25) 프로그래머스 [Python] Lv.1 나누어 떨어지는 숫자 배열
문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
제한사항
- arr은 자연수를 담은 배열입니다.
- 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
- divisor는 자연수입니다.
- array는 길이 1 이상인 배열입니다.
입출력 예
| arr | divisor | return |
| [5, 9, 7, 10] | 5 | [5, 10] |
| [2, 36, 1, 3] | 1 | [1, 2, 3, 36] |
| [3,2,6] | 10 | [-1] |
저는 이렇게 풀었습니다... 👇👇👇

▼ 1차 시도
def solution(arr, divisor):
answer = []
for i in arr:
if i % divisor == 0:
answer.append(i)
answer.sort()
elif answer == []: # 🚨여기가 문제!!🚨
answer.append(-1)
return answer
- 원인: elif answer == [] 구문이 for 루프 내부에 있음 → 반복문이 돌 때마다 조건을 체크하게 됨
- 결과: 앞에 나누어 떨어지지 않는 숫자가 있으면 배열이 비어있다고 판단해 -1을 먼저 집어넣게 되어버린다;;
▼ 2차 시도
def solution(arr, divisor):
answer = []
for i in arr:
if i % divisor == 0:
answer.append(i)
answer.sort()
# for문이 완전히 끝난 뒤에 들여쓰기를 맞춰서 체크
if answer == []:
answer.append(-1)
return answer
앞으로는 . . .
1. 이 작업이 반복될 때마다 실행되어야 하는가? vs 모든 반복이 다 끝난 후 최종적으로 실행되어야 하는가? 를 먼저 생각하자
2. for문 안에서 최종 예외 처리(-1 리턴 등)를 성급하게 하고 있지 않은지 체크하자
20번 넘어가고 부터는 한번에 통과된 적이 거의 없다............😅
002
오늘 학습한 내용
⌨️ 리스트 컴프리헨션 연습
문제를 계속 풀다보니 코드를 좀 더 멋지게 짜고 싶은 욕심이 생겨서, 오전에 리스트 컴프리헨션 연습 문제들을 풀었다.

확실히 문제를 풀며 코드를 직접 손으로 작성해보니까 이해가 된다.
그냥 멋들어진 코드 보고 우와~배우고갑니다~ 하고 넘겼을 때랑 완전히 다름


리스트 컴프리헨션 공식 정리 (with 조건문)
1. if만 쓸 때: 필터링
이때 if문은 리스트에서 특정 조건을 만족하는 애들만 합격 시켜서 통과시키는 필터 역할
[ 표현식 for 변수 in 리스트 if 조건문 ]
- 원리: for문 돌면서 데이터를 하나씩 꺼낸 다음, 맨 뒤에 있는 if 필터를 통과한 애들만 맨 앞으로 보내서 리스트에 담는 것! 필터 탈락자들은 나가리~
2. if-else 쓸 때: 삼항 연산자 (값 변환)
이때 if-else는 데이터를 버리는 게 X. "조건이 참이면 A로 바꾸고, 거짓이면 B로 바꿔라"라는 값을 결정해준다.
파이썬에서는 이걸 '삼항 연산자'라고 부르고, 하나의 '값'으로 취급한다고 한다.
[ 참일때값 if 조건문 else 거짓일때값 for 변수 in 리스트 ]
- 원리: 맨 뒤의 for문이 돌면서 데이터를 꺼내면, 맨 앞에 있는 if-else 세트가 "너는 조건 만족하니까 A!", "너는 만족 못 하니까 B!" 하고 값을 새로 찍어내서 리스트에 담아주는 것~
📚 데이터 레벨업! 전처리 & 시각화 세션 4회차 [허진성 튜터님]
시각화의 목적 : 자료를 더 보기 쉽게 만들어주고, 시각화된 데이터를 기반으로 합리적인 의사결정을 하기 위함
Matplotlib 공식 Docs : https://matplotlib.org/3.5.0/api/_as_gen/matplotlib.pyplot.html#module-matplotlib.pyplot
▼ 코드 실행 전 설정
# 라이브러리 설치 및 한글 폰트 설정
# 튜터님 감사합니다
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 한글 폰트 설정 (Windows/Mac)
import platform
if platform.system() == 'Darwin': # Mac
plt.rc('font', family='AppleGothic')
elif platform.system() == 'Windows': # Windows
plt.rc('font', family='Malgun Gothic')
# 마이너스 부호 깨짐 방지
plt.rc('axes', unicode_minus=False)
# 화질 선명하게 설정 (Retina 디스플레이 지원)
%config InlineBackend.figure_format = 'retina'
1. Matplotlib 주요 메서드 모아보기
모든 문법을 암기하려 하지 말고, 잘 짜여 있는 예시 코드를 찾아다가 값만 바꾸는 방식으로 접근하자.
| 분류 | 메서드 / 코드 | 기능 및 주요 옵션 |
| 기본 그리기 | plt.plot(x, y, '포맷문자열') | 선 또는 마커 그래프 생성 (ex. 'ro' = 빨간 원, 'b-' = 파란 실선) |
| 축 범위 | plt.axis([xmin, xmax, ymin, ymax]) | x축과 y축의 최소/최대 범위 지정 |
| 라벨 & 제목 | plt.xlabel('명칭', labelpad=15, fontdict=font) plt.ylabel('명칭') plt.title('제목', loc='center') |
축 이름과 그래프 제목 설정 • labelpad: 축과의 여백 • fontdict: 폰트 스타일 딕셔너리 적용 • loc: 위치 (right, top, left 등) |
| 범례 | plt.legend() | 그래프의 범례 표시 |
| 저장 & 출력 | plt.savefig('파일명.png') plt.show() |
@중요@ 무조건 plt.show() 전에 plt.savefig()를 실행해야 정상적으로 저장됨 (뒤에 쓰면 빈 화면 저장) |
- 자주 쓰는 포맷 문자열 정리
- 색상: 'b'(파랑), 'g'(초록), 'r'(빨강), 'c'(청록), 'm'(자조), 'y'(노랑), 'k'(검정), 'w'(흰색)
- 마커: '.'(점), 'o'(원), 'v'(아래 삼각형), '^'(위 삼각형), 's'(정사각형), '*'(별)
- 선 종류: '-'(실선), '--'(점선), '-.'(점-실선), ':'(촘촘한 점선)
2. 주요 그래프별 특징 및 사용 예시
그래프 이미지 출처: https://matplotlib.org/stable/gallery/index
Examples — Matplotlib 3.10.9 documentation
Examples For an overview of the plotting methods we provide, see Plot types This page contains example plots. Click on any image to see the full image and source code. For longer tutorials, see our tutorials page. You can also find external resources and a
matplotlib.org
나중에 직접 데이터 시각화할 때 위 사이트에서 코드 복붙하고 값 바꿔주는 식으로 만들면 될 듯
▼ 아래 접은 글에 자세하게 정리
① 막대 그래프 (plt.bar())

- 특징: 범주형 데이터를 상호 비교할 때 가장 직관적이고 유용
- 사용 예시: " 실험 장비 모델별(A, B, C형) 연간 고장 발생 횟수 비교 "
튜터님 왈 : 모든 분석에서 막대그래프만 잘 써도 70~80%는 해결된다.
그만큼 가장 기본이 되는 그래프인 듯
② 산점도 (plt.scatter())

- 특징: 두 개의 연속형(숫자) 변수 간에 어떤 관계나 상관관계가 있는지 분포를 확인할 때 사용함.
- 사용 예시: " 제조 공정 시 가열 온도와 최종 제품의 인장 강도 간의 관계 "
③ 히스토그램 (plt.hist())

- 특징: 데이터가 어디에 치우쳐져 있는지, 전반적인 분포 자체를 확인할 때 사용함. (막대그래프와 다름)
- 사용 예시: " 최근 한 달간 입고된 원자재 샘플들의 무게 분포 확인 (정격 규격 이탈 여부 파악) "
④ 다중 막대 그래프

- 특징: 하나의 범주(X축) 안에 또 다른 하위 범주가 존재할 때, 두 개 이상의 막대를 나란히 배열하여 데이터를 비교하는 그래프
- 사용 예시: " 전체 매출액 중 각 제품군(A상품, B상품, C상품)이 차지하는 매출 비중 "
⑤ 선 그래프 (plt.plot())

- 특징: 시계열 데이터처럼 시간이나 순서의 흐름에 따른 변화 추이를 볼 때 사용
- 사용 예시: " 공장 내 주요 보관창고의 24시간 실시간 습도 변동 추이 "
⑥ 파이 차트 (plt.pie())

- 특징: 전체에서 각 항목이 차지하는 비율(%)을 나타냄. autopct 옵션으로 퍼센트를 자동 계산할 수 있음.
- 사용 예시: " 체 매출액 중 각 제품군(A상품, B상품, C상품)이 차지하는 매출 비중 "
🚨 주의 : 각 항목의 면적이 비슷하면 직관적으로 크기를 비교하기 어려우므로, 수치 비교용으로는 부적절
⑦ 박스 플롯 (plt.boxplot())

- 특징: 데이터의 분포와 이상치(Outlier)를 동시에 감지할 때 사용. 최소값, 1사분위($Q_1$), 중앙값, 3사분위($Q_3$), 최대값의 5가지 요약을 시각화, 박스 바깥의 점들이 이상치
이상치 판단 기준 (IQR)
- 상한선: $Q_3 + (1.5 \times \text{IQR})$
- 하한선: $Q_1 - (1.5 \times \text{IQR})$ (단, $\text{IQR} = Q_3 - Q_1$)
- 사용 예시: " 생산 라인별 제품 검사 소요 시간의 편차 및 이상치(유독 오래 걸린 작업) 발견 "
⑧ 바이올린 플롯 (plt.violinplot())

- 특징: 박스 플롯의 단점(데이터가 내부에서 어떻게 퍼져있는지 밀도를 알기 어려움)을 보완하여 데이터의 밀도까지 곡선 형태로 보여줌. 뚱뚱한 부분에 데이터가 많이 몰려있음을 뜻함.
- 사용 예시: " 연령대별(20대, 30대, 40대) 특정 기능성 화장품에 대한 만족도 점수 밀도 비교 "
⑨ 트리맵 (squarify 라이브러리 필요)

- 특징: 전체에서 차지하는 비중을 사각형의 면적으로 표현. 파이 차트와 비슷하지만 사각형 공간을 채우므로 항목이 많아져도 가독성 good.
- 사용 예시: " 올해 전체 지출 예산 중 인건비, 임대료, 마케팅비 등 항목별 차지하는 면적 비교 "
⑩ 히트맵 (sns.heatmap())

- 특징: 데이터 간의 상관관계를 색상의 짙고 옅음으로 표현하여 한눈에 파악하기 쉬움. 최신 Pandas 버전에서는 수치형 데이터만 계산하도록 numeric_only=True 옵션이 필요할 수 있음.
- 사용 예시: " 품질 검사 데이터셋에서 불량률, 공정 온도, 습도, 압력 등 모든 변수 간의 상관계수 시각화 "
3. ★ 그래프를 그리는 3가지 방식
방식 1. Pyplot 스타일
plt. 뒤에 명령어를 연속해서 붙여서 간단/빠르게 생성할 때 사용
plt.figure(figsize=(6, 4))
plt.bar(day_counts.index, day_counts.values)
plt.title("요일별 손님 수 (plt 방식)")
plt.xlabel("요일")
plt.ylabel("빈도")
plt.show()
방식 2. 객체 지향 스타일
도화지(fig)와 축(ax)을 생성, 제어. 그래프를 여러 개 배치 or 세밀하게 커스텀할 때 필수적!! 명령어 앞에 set_ 접두사가 붙는 경우가 많음.
# 1. 도화지와 축 생성
fig, ax = plt.subplots(figsize=(6, 4))
# 2. ax 객체에 직접 그리도록 명령
ax.bar(day_counts.index, day_counts.values, color='orange')
# 3. set_ 접두사를 사용하여 라벨 설정
ax.set_title("요일별 손님 수 (ax 방식)")
ax.set_xlabel("요일")
ax.set_ylabel("빈도")
plt.show()
방식 3. Pandas 내장 Plotting API (df.plot())
Matplotlib을 사용하기 쉽게 포장해 둔 기능! 실무에서 많이 씀. 실행 시 내부적으로 Matplotlib 코드를 대신 수행
df.plot(kind='그래프종류') 또는 df.plot.그래프종류()
# rot=0: x축 글자를 회전 없이 똑바로 표시
tips['day'].value_counts().plot(kind='bar', figsize=(6, 4), color='orange', rot=0)
plt.title("요일별 데이터 개수 (Pandas Plot)")
plt.show()
객체 지향형과 혼합해서 쓰는 실무 테크닉
- df.plot()의 결과물로 Matplotlib의 ax(축) 객체가 반환 → 이를 변수로 받으면 Matplotlib의 명령어를 쓸 때나 추가로 선을 그릴 때 편리하다!!
avg_tip = tips.groupby('day')['tip'].mean()
# pandas로 그리면서 ax 객체 반환받기
ax = avg_tip.plot(kind='bar', figsize=(6, 4), color='teal', rot=0)
# Matplotlib 메서드로 세밀하게 제어
ax.set_title("요일별 평균 팁 (Pandas + Matplotlib 혼합)")
ax.set_xlabel("요일 (Day)")
ax.set_ylabel("평균 팁 ($)")
# 전체 평균선 추가 및 범례 표시
ax.axhline(avg_tip.mean(), color='red', linestyle='--', label='전체 평균')
ax.legend()
plt.show()
003
오늘의...💡
데이터 전처리 & 시각화 강의 완강!
강의 마무리 쯤에 적어두면 좋을 것 같은 내용들을 말씀해주셔서, 아래 내용을 메모하며 들었다.
코딩 스킬보다 중요한 것은 '방향성'이다. 기술은 반복하면 늘지만, "내가 무엇을 해결하기 위해 전처리를 하고, 어떤 인사이트를 얻기 위해 시각화를 하는지"를 사전에 정의하지 않으면 코드 로직에만 몰두하다 길을 잃는다.
구글링 생활화: 모르는 함수나 기억나지 않는 상황이 오면 즉시 구글링하는 습관이 중요하다! 스스로 검색하고 체득하는 과정에서 학습 속도가 빨라질 수도... (단, 교차 검증을 통해 잘못된 정보가 없는지 마지막에 확인 필수)
10분 판다스 활용: 판다스 공식 문서의 튜토리얼을 맹목적으로 받아쓰기하듯 따라 쳐보면서 자주 쓰는 실무 함수를 눈과 손에 익히는 연습이 효과적임. 전처리나 시각화를 시작하기 전, 내가 무엇을 위해 데이터를 확인할 것인지 메모하는 습관을 들여야 한다.

내일은 투표하고 푹 쉬겠습니다
'Today I Learned' 카테고리의 다른 글
| [내일배움캠프 QA/QC 6기] TIL #018 (0) | 2026.06.05 |
|---|---|
| [내일배움캠프 QA/QC 6기] TIL #017 직접 해보기 (0) | 2026.06.04 |
| [내일배움캠프 QA/QC 트랙 6기 본캠프] TIL #015 데이터 전처리 & 시각화 (0) | 2026.06.01 |
| [내일배움캠프 QA/QC 트랙 6기 본캠프] TIL #014 🐼s (1) | 2026.05.29 |
| [내일배움캠프 QA/QC 트랙 6기 본캠프] TIL #013 데이터 분석 입문! (0) | 2026.05.28 |