001
오늘의 코드카타
52.명예의 전당 (1)
문제 설명
과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.
한 상자에 사과를 m개씩 담아 포장합니다.
상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.
과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)
예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.
(최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8
사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.
제한조건
- 3 ≤ k ≤ 9
- 3 ≤ m ≤ 10
- 7 ≤ score의 길이 ≤ 1,000,000
- 1 ≤ score[i] ≤ k
- 이익이 발생하지 않는 경우에는 0을 return 해주세요.

def solution(k, m, score):
answer = 0
score.sort(reverse=True) # 내림차순 정렬
# score에서 m개씩 잘라서(슬라이싱) 바로 계산
for i in range(0, len(score) - len(score) % m, m):
box = score[i : i + m] # 앞에서부터 m개씩 상자에 담기 (삭제 X)
answer += min(box) * m # 최저점 * m
return answer
[ 시계열 이상 탐지 라이브 세션 1회차 ]
1. 스마트팩토리데이터 & '맥락'
- 스마트팩토리란? : 설비 + 센서 + 생산 + 품질 데이터를 하나로 연결해 공정 상태를 확인하고 데이터 기반으로 의사결정을 내리는 제조 시스템
- 단순히 센서 숫자만 보면 안 되고, [설비 상태 + 제품 조건 + 정비 이력 + 품질 결과] 같은 제조 맥락을 함께 봐야 "왜 이 이상 변화가 일어났는지" 진짜 원인을 알 수 있음
2. 일반 표 vs 시계열 데이터
| 구분 | 일반 표 데이터 | 시계열 데이터 |
| 핵심 목적 | 여러 대상 간의 비교 | 동일 설비의 시간에 따른 변화 분석 |
| 행 순서 | 중요하지 않음 | 순서 자체가 핵심 정보 (순서 파괴 시 흐름 소멸) |
| 관측값 관계 | 각 관측값이 서로 독립적 | 가까운 시점끼리 서로 관련됨 (자기상관성) |
- 주의: 시간적 선후관계가 있다고 해서 무조건 인과관계는 아님! (예: 전류가 먼저 뛰고 온도가 나중에 올라도, 전류가 온도의 직접 원인인지는 별도 검증 필요)
3. 시계열 4대 패턴
- 추세 (Trend): 장기적으로 쭉 증가하거나 감소하는 방향 (예: 설비 노후화로 전력 소비 증가)
- 계절성 (Seasonality): 일정한 간격으로 반복되는 패턴 (예: 주간조/야간조 생산량 차이)
- 주기 (Cycle): 반복은 되지만 간격이 일정하지 않음 (예: 설비 가압·감압 운전)
- 잔차 (Residual): 위 3개로 설명되지 않는 남은 부분.
- 잔차 전부가 이상치는 X 정상 범위를 벗어나거나 비정상적 구조를 보일 때만 '이상 후보'로 판단
4. 자기상관 & 물리적 관성
제조 센서(온도, 압력 등)는 갑자기 값이 튀지 않는 물리적 관성이 있음. 즉, 현재 값은 가까운 과거 값과 비슷하게 움직임(=자기상관). 따라서 시계열 데이터의 행 순서를 섞으면 이 흐름 자체가 완전히 파괴됨
5. Lag & Window
- Lag (시차): 현재 기준 몇 단계 이전 값인가? (예: Lag 5 = 5분 전 값)
- Window (구간): 현재를 해석하기 위해 함께 보는 연속된 과거 구간 (예: Window 5 = 최근 5개 구간)
- ⚠️ 같은 Lag 5, Window 5라도 수집 주기(Sampling Interval)가 다르면 실제 의미하는 시간이 완전히 달라진다. 항상 수집 주기와 세트로 확인!
6. 절대 시간 vs 공정 시간
| 구분 | 절대 시간 | 공정 시간 |
| 기준 | 시계 시각 (몇 시 몇 분, 주/야간조) | 공정 흐름 (기동 후 몇 분, Batch 시작 후 몇 시간) |
| 특징 | 작업 환경이나 shift 분석에 유리 | 제조 패턴 파악에 훨씬 유리 (동일 공정 단계 비교 가능) |
- 같은 70℃라도 "기동 직후"냐 "장시간 가동 중"이냐에 따라 의미가 천지차이 → 공정 시간 정렬이 핵심
7. Operating Mode(운전 모드) 혼합의 함정
정지(0A) 상태와 가동(4A) 상태를 섞어서 단순 평균을 내면 2A가 나온다.
하지만 2A는 실제 정상 가동 상태가 아니라 전환 과정에서만 잠시 거쳐가는 값
→ 모델링 전, 데이터 안에 어떤 운전 모드들이 섞여 있는지 필수 검증할 것
8. SPC(통계적 공정관리)에서 시계열 확장까지
1) 관리한계 vs 규격한계
- 관리한계 (UCL/LCL): 실제 공정 데이터 기준 → "공정이 통계적으로 안정적인가?"
- 규격한계 (USL/LSL): 고객/설계 요구 기준 → "제품이 요구 기준을 만족하는가?"
- ⚠️ 관리한계를 벗어났다고 무조건 불량도 아니고, 규격 안에 있다고 공정이 안정적인 것 X
2) Nelson Rules 주요 패턴 ⭐
| 규칙 | 패턴 조건 | 의미 및 대표 사례 |
| Rule 1 | 1개 점이 3σ 이탈 | Point Anomaly (순간 과전류, 압력 스파이크) |
| Rule 2 | 9개 점이 연속으로 중심선 한쪽에 위치 | Level Shift (정비 후 센서 오프셋 변화) |
| Rule 3 | 6개 점이 연속 증가 또는 감소 | Trend Anomaly (베어링 마모, 지속적 온도 상승) |
| Rule 4 | 14개 점이 연속으로 교번 (왔다갔다) | Oscillation (제어기 헌팅, 밸브 반복 개폐) |
💡 Nelson Rules는 고장을 확정하는 게 아니라 "조사할 가치가 있는 패턴"을 감지하는 규칙
3) 분석 단계의 확장 흐름
기초통계 (현재 요약)
➔ SPC (시간 흐름에 따른 Shift/Trend 감시)
➔ 시계열 Feature Engineering (변화량, 최근 구간 수치화)
➔ 예측 모델 (미래 값 예측)
➔ 다변량 이상탐지 / AutoEncoder (정상 패턴 탈피 시퀀스 감지)
서로를 대체하는 게 아니라, 뒤로 갈수록 앞 단계에서 못 본 정교한 정보를 덧붙여 주는 구조임!
[ Streamlit 심화: 대시보드 레벨업 ]
1. 레이아웃 4대장
- st.columns(): 화면 수직 분할 (비율 지정 가능)
- st.expander(): 접이식 UI (세부 정보 숨기기용)
- st.tabs(): 탭 단위 컨텐츠 분리
- st.sidebar: 좌측 사이드바 메뉴 배치
2. 멀티페이지 구성 (st.Page, st.navigation)
제조 대시보드는 [홈 / 생산데이터 / 품질관리 / 예지보전] 처럼 기능별로 페이지를 나누는 게 국룰
# 기본 구조 예시
page1 = st.Page("pages/home.py", title="Home", icon="🏠")
page2 = st.Page("pages/quality.py", title="품질 관리", icon="📊")
pg = st.navigation([page1, page2])
pg.run()
3. State 관리 (st.session_state)
Streamlit은 코드 변경/버튼 클릭마다 전체 코드가 재실행되어 변수가 초기화됨.
페이지가 재실행돼도 데이터를 유지하려면 Session State가 필수!
# 세션 상태 초기화 및 사용
if "count" not in st.session_state:
st.session_state.count = 0
st.session_state.count += 1
4. Performance 최적화 (@st.cache_data)
대용량 제조 데이터를 로드하거나 복잡한 연산을 수행할 때 필수적인 캐싱 기능. 동일한 입력값에 대해 재연산 없이 기존 결과를 빠르게 반환함!
@st.cache_data
def load_data(filepath):
# 무거운 데이터 로딩 작업
return pd.read_csv(filepath)

5. Custom Theme (config.toml)
.streamlit/config.toml 작성으로 코드 수정 없이 대시보드 테마 변경 가능:
[theme]
primaryColor="#F63366"
backgroundColor="#FFFFFF"
secondaryBackgroundColor="#F0F2F6"
textColor="#262730"

'Today I Learned' 카테고리의 다른 글
| [내일배움캠프 QA/QC 6기] TIL #054 (0) | 2026.07.29 |
|---|---|
| [내일배움캠프 QA/QC 6기] TIL #053 (1) | 2026.07.28 |
| [내일배움캠프 QA/QC 6기] TIL #051 (0) | 2026.07.24 |
| [내일배움캠프 QA/QC 6기] TIL #050 스트림릿 입문 (0) | 2026.07.23 |
| [내일배움캠프 QA/QC 6기] TIL #048 태블로 프렙 (0) | 2026.07.21 |