Today I Learned

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

JiJi0406 2026. 7. 27. 23:47

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 해주세요.

 

더보기
1차 시도... 제출하면서도 음 안 될 것 같은데...^^ 했는데 역시나 성능 이슈로 실패

 

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대 패턴

  1. 추세 (Trend): 장기적으로 쭉 증가하거나 감소하는 방향 (예: 설비 노후화로 전력 소비 증가)
  2. 계절성 (Seasonality): 일정한 간격으로 반복되는 패턴 (예: 주간조/야간조 생산량 차이)
  3. 주기 (Cycle): 반복은 되지만 간격이 일정하지 않음 (예: 설비 가압·감압 운전)
  4. 잔차 (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"