[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1661. Average Time of Process per Machine

잰잰' 2025. 4. 11. 16:54
Table: Activity

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| machine_id     | int     |
| process_id     | int     |
| activity_type  | enum    |
| timestamp      | float   |
+----------------+---------+

이 테이블은 공장 웹사이트에서의 사용자 활동을 보여줍니다.
(machine_id, process_id, activity_type)는 이 테이블의 기본 키입니다 (세 컬럼의 조합이 유일한 값을 가짐).
- machine_id는 기계의 ID입니다.
- process_id는 해당 기계(machine_id)에서 실행 중인 프로세스의 ID입니다.
- activity_type은 'start', 'end' 중 하나의 값을 가지는 ENUM(열거형) 타입입니다.
- timestamp는 현재 시간을 **초 단위의 실수(float)**로 나타낸 값입니다.

'start'는 해당 시점에 기계가 프로세스를 시작했다는 의미이고,
'end'는 해당 시점에 기계가 프로세스를 종료했다는 의미입니다.
모든 (machine_id, process_id) 쌍에 대해
- 'start' 시간은 항상 'end' 시간보다 이전이며,
- 'start'와 'end'는 각각 정확히 하나씩 존재하는 것이 보장됩니다.

 

문제

공장 웹사이트에는 여러 대의 기계가 있으며, 각 기계는 동일한 개수의 프로세스를 실행합니다.
각 기계가 하나의 프로세스를 완료하는 데 걸리는 평균 시간을 구하는 해결 방법을 작성하세요.
- 프로세스를 완료하는 데 걸리는 시간은 'end'의 timestamp에서 'start'의 timestamp를 뺀 값입니다.
- 평균 시간은 해당 기계에서 실행된 모든 프로세스의 총 처리 시간을 프로세스 개수로 나눈 값입니다.

 

결과 테이블은 다음 정보를 포함해야 합니다:
- machine_id
- processing_time (소수점 셋째 자리까지 반올림된 평균 처리 시간)

결과 테이블의 정렬 순서는 상관없습니다.
결과 형식은 다음 예시와 같습니다.

Example 1:

Input: 
Activity table:
+------------+------------+---------------+-----------+
| machine_id | process_id | activity_type | timestamp |
+------------+------------+---------------+-----------+
| 0          | 0          | start         | 0.712     |
| 0          | 0          | end           | 1.520     |
| 0          | 1          | start         | 3.140     |
| 0          | 1          | end           | 4.120     |
| 1          | 0          | start         | 0.550     |
| 1          | 0          | end           | 1.550     |
| 1          | 1          | start         | 0.430     |
| 1          | 1          | end           | 1.420     |
| 2          | 0          | start         | 4.100     |
| 2          | 0          | end           | 4.512     |
| 2          | 1          | start         | 2.500     |
| 2          | 1          | end           | 5.000     |
+------------+------------+---------------+-----------+
Output: 
+------------+-----------------+
| machine_id | processing_time |
+------------+-----------------+
| 0          | 0.894           |
| 1          | 0.995           |
| 2          | 1.456           |
+------------+-----------------+

설명 :
총 3개의 기계가 있고, 각각 2개의 프로세스를 실행하고 있습니다.

기계 0의 평균 시간:
((1.520 − 0.712) + (4.120  −3.140)) / 2 = 0.894

기계 1의 평균 시간:
((1.550 − 0.550) + (1.420 − 0.430)) / 2 = 0.995

기계 2의 평균 시간:
((4.512 − 4.100) + (5.000 − 2.500)) / 2 = 1.456

 

✏️ 풀이

import pandas as pd

def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:
    result = activity.pivot_table(index=['machine_id', 'process_id'], columns='activity_type', values='timestamp').assign(processing_time=lambda x:x['end'] - x['start']).reset_index()
    result = result.groupby(['machine_id'])['processing_time'].mean().reset_index(name='processing_time')

    return result

 

📚 개념정리

pivot_table() ? 데이터를 집계, 요약하는데 사용되는 함수. 주로 데이터를 그룹화하고, 특정 컬럼에 대한 값을 요약해서 보기 쉽게 테이블 형식으로 변환할 때 사용

# 기본 구조 #
df.pivot_table(
    index=None,           # 그룹화할 행을 지정
    columns=None,         # 그룹화할 열을 지정
    values=None,          # 계산할 값의 열을 지정
    aggfunc='mean',       # 집계 함수 (기본값은 평균)
    fill_value=None,      # 결측값을 채울 값
)

 

- index: 데이터를 그룹화할 행 기준을 지정. 예를 들어, 특정 id나 날짜로 그룹화할 때 사용.

- columns: 데이터를 그룹화할 열 기준을 지정. 예를 들어, type을 기준으로 그룹화할 수 있음.

- values: 집계할 값을 지정하는데, 예를 들어 'time' 컬럼의 값들을 집계하고 싶으면 이 부분에 'time'을 지정.

- aggfunc: 데이터를 집계하는 방법을 지정. 기본값은 'mean' (평균)이고, sum, count, min, max 등도 사용할 수 있음.