Today I Learned

[내일배움캠프 QA/QC 6기] TIL #017 직접 해보기

JiJi0406 2026. 6. 4. 21:11

 

001

오늘의 코드카타

(26) 프로그래머스 [Python] Lv.1  음양 더하기

 

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • absolutes의 길이는 1 이상 1,000 이하입니다.
    • absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
  • signs의 길이는 absolutes의 길이와 같습니다.
    • signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다

 

입출력 예

absolutes signs
[4,7,12] [true,false,true]
[1,2,3] [false,false,true]

 

 

입출력 예 설명

입출력 예 #1

  • signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.
  • 따라서 세 수의 합인 9를 return 해야 합니다.

입출력 예 #2

  • signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.
  • 따라서 세 수의 합인 0을 return 해야 합니다.

 

 

 

▼ 내가 짠 코드...

더보기
def solution(absolutes, signs):
    answer = []
    c = -1
    for i in signs:
            if i == True:
                c += 1 # 반복문 한 사이클 돌 때마다 1씩 더하기
                answer.append(absolutes[c]) # absolutes 리스트의 c번째 값을 추가
            else:
                c += 1
                answer.append(absolutes[c] * -1) # absolutes 리스트의 c번째 값을 음수로 만들어 추가
    return sum(answer)

 

일단 오늘 문제는 그리 어렵지 않게 통과...했다만, 딱 봐도 복잡 지저분하죠?

좀 더 멋지게😎 짜는 방법을 알고 싶어서 저의 항시대기 파이썬 과외쌤께 SOS침

 

 


 

💡 새롭게 알게 된 것들 정리

 

1. 두 배열을 동시에 묶어 돌릴 땐 zip() 함수 !

원래는 인덱스용 변수 c를 따로 만들어서 1씩 더해가며 두 배열(absolutes, signs)의 값을 매칭했으나...zip() 함수를 쓰면 이 노가다를 단 한 줄로 줄일 수 있다!

  • 원리: zip(배열A, 배열B)를 쓰면 두 배열에서 원소를 하나씩 세트로 꺼내서 튜플로 묶어줌.
  • 적용:
    for num, sign in zip(absolutes, signs):
    # num에는 절대값, sign에는 부호(True/False)가 알아서 쏙쏙 매칭됨!

 

2.if sign == True:는 굳이? 그냥 if sign: 

signs 배열에 담긴 값 자체가 이미 True나 False 같은불리언(Boolean) 데이터!

  • 원리:i f 문은 뒤에 오는 조건이 '참'이면 실행됨. 즉,sign 자체가 이미 True라면 if True == True:라고 구구절절 쓸 필요 없이그냥 if sign:만써도 파이썬이 알아서 찰떡같이 알아듣는다.

 

3.음수 만드려고 * -1도 굳이;;; 대신 그냥 빼버리기

부호가 False일 때, 정수를 음수로 바꾸려고 num * -1을 한 뒤에 결과 배열에 추가했음.

근데 생각해보니까 어차피 총합을 구하는 문제잖아? ㅎㅎ;;

  • 원리: 어떤 값을 더한 뒤에 -1을 곱한 값을 또 더하는 구조라면, 애초에 총합 변수(answer)에서 그 값을그냥 빼버리면(-= num)
  • 효과: 불필요한 곱셈 연산도 줄이고, 임시 리스트를 만들어서 sum()을 또 돌릴 필요가 없어진다!!

 

★ 최종 요약 (비포&애프터)

  • Before (끄응...;): 리스트 만들고, 인덱스 변수 c 키우고, == True 확인하고, * -1 곱해서 리스트에 넣고, 마지막에 sum() 돌리고....... (굳이...의 연속으로 굉장히 복잡해짐 😅)
  • After (인사이트 반영): zip()으로 묶고, if sign:으로 체크해서, 바로 += 또는 -= 로 합산하기!
def solution(absolutes, signs):
    answer = 0
    for num, sign in zip(absolutes, signs):
        if sign:
            answer += num
        else:
            answer -= num
    return answer

 

 


 

이 개념들에 더해 화요일에 정리한 리스트 컴프리헨션 삼항 연산자로 정리하면 아래처럼 한줄컷도 가능하다. 

 

def solution(absolutes, signs):
    return sum(num if sign else -num for num, sign in zip(absolutes, signs))

 

 


 

002

오늘 학습한 내용

 

📕 전처리 & 시각화 Library 개인 과제

내일까지 제출해야 하는 과제가 있어서 오늘 다 끝내버렸다.

 

Lv. 1부터 3-2까지는 무난하게 잘 풀렸다 !

(당연함. 기억 안 나는 함수는 싹 다 찾아보면서 했음.)

(양심껏 Ai는 안 씀. 물론 이것도 당연함...^^)

 

제일 마지막 문제는 데이터를 살펴보고 자유롭게 시각화해보는 것이었는데, 어떤 데이터를 살펴볼지 주제를 선정하는 게 꽤 오래 걸렸다.

 

그래서 저는 어떻게 했냐면요...👇👇👇

더보기

1. 분석 개요 & 목적

주어진 제조 공정 데이터를 바탕으로 데이터 전처리, 시계열 그룹화, 선 그래프 시각화 까지 직접 수행해보았다!

데이터셋이 가진 제약 사항(데이터 부족 및 결측치)을 생각하면서, 그 안에서 도출할 수 있는 최선의 인사이트를 찾는 것에 목적을 두고 시작했다.

  • 분석 주제: 시계열 흐름에 따라 라인별 가동 시간은 어떻게 변할까?
  • 목적:
    • 라인별로 어느 날에 가동 시간이 가장 길었는지 알아보기.
    • 시간 흐름에 따른 가동 시간의 일정한 추세가 존재하는지 살펴보기.

 

2. 데이터 전처리

결측치 정제 → 시계열 분석이 가능한 상태로 데이터 가공

 

① 결측치 확인 및 제거

df.isnull().sum()을 통해 데이터셋 전체의 결측치 현황을 파악

→ 확인 결과 operation_time_A 열에 결측치가 존재하는 것을 발견

→ 데이터 왜곡을 방지하기 위해 해당 행 제거

 

# operation_time_A 열의 결측치가 있는 행 제거
df = df.dropna(subset=['operation_time_A'])

 

② 시계열 데이터 타입 변환

기존 date 컬럼의 데이터 타입이 문자열(object)인 것을 확인

  pd.to_datetime()을 활용해 datetime 타입으로 변환 

 

 

3. 데이터 집계 및 시각화

 

① 날짜별 가동 시간 평균치 그룹화

동일 날짜에 존재하는 데이터들을 통합하기 위해 groupby('date')를 적용하고,

각 라인(A, B, C)의 가동 시간 평균값(mean)을 산출

 

② 선 그래프(Line Plot) 생성

시간의 흐름에 따른 연속적인 변화 추이를 관찰하기 가장 적합한 선 그래프를 선택. 

 

# 시계열 추이 관찰을 위한 선 그래프 생성
time_by_date.plot(kind="line", figsize=(10,6)) 
plt.title("Average operation time by date")
plt.xlabel("Date")
plt.ylabel("time")
plt.grid(True)
plt.show()

 

 

 

 

4. 분석 결과 및 인사이트

A, B 라인은 1월 3일에 가동 시간 정점을 찍은 뒤, 다음 날인 4일에 감소하는 유사한 흐름을 보인 반면, 
C 라인은 기간 내내 가동 시간이 계속 증가하는 우상향의 흐름을 보였다.

모든 날짜에서 가동 시간의 길이는 C > B > A 순으로 고정되어 나타났다.

그러나 해당 분석은 단 4일간의 데이터만을 바탕으로 수행되었기 때문에 일반화가 어렵고, 확실한 경향성 파악을 위해서는 추가적인 데이터 수집이 필요하다.

 


 

+

 

오늘 라이브세션 내용은 시간 없음 이슈로 정리를 못했다... 내일 할게요