[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1741. Find Total Time Spent by Each Employee

잰잰' 2025. 4. 9. 23:02
Table: Employees

+-------------+------+
| Column Name | Type |
+-------------+------+
| emp_id      | int  |
| event_day   | date |
| in_time     | int  |
| out_time    | int  |
+-------------+------+

(emp_id, event_day, in_time)은 이 테이블의 기본 키(고유 값이 있는 열들의 조합)입니다.
이 테이블은 직원들의 사무실 출입 기록을 보여줍니다.
event_day는 이 이벤트가 발생한 날짜를 나타내며, in_time은 직원이 사무실에 입장한 분을 나타내고, out_time은 직원이 사무실을 떠난 시간을 나타냅니다.
in_time과 out_time은 1과 1440 사이의 값입니다.
같은 날짜에 두 이벤트가 시간상 겹치지 않으며, in_time은 out_time보다 항상 작다는 것이 보장됩니다.

 

문제

각 직원이 하루 동안 사무실에서 보낸 총 시간을 계산하는 솔루션을 작성하세요. 하나의 날짜에 직원이 여러 번 입장하고 퇴장할 수 있다는 점에 유의하세요. 하나의 입장에 대해 사무실에서 보낸 시간은 out_time - in_time입니다.

결과 테이블은 아무 순서로 반환할 수 있습니다.

결과 형식은 아래 예시와 같습니다.

Example 1:

Input: 
Employees table:
+--------+------------+---------+----------+
| emp_id | event_day  | in_time | out_time |
+--------+------------+---------+----------+
| 1      | 2020-11-28 | 4       | 32       |
| 1      | 2020-11-28 | 55      | 200      |
| 1      | 2020-12-03 | 1       | 42       |
| 2      | 2020-11-28 | 3       | 33       |
| 2      | 2020-12-09 | 47      | 74       |
+--------+------------+---------+----------+
Output: 
+------------+--------+------------+
| day        | emp_id | total_time |
+------------+--------+------------+
| 2020-11-28 | 1      | 173        |
| 2020-11-28 | 2      | 30         |
| 2020-12-03 | 1      | 41         |
| 2020-12-09 | 2      | 27         |
+------------+--------+------------+

설명 :
직원 1은 세 개의 이벤트가 있습니다: 2020-11-28에 두 개의 이벤트가 있으며, 총 시간은 (32 - 4) + (200 - 55) = 173이고, 2020-12-03에 한 개의 이벤트가 있으며, 총 시간은 (42 - 1) = 41입니다.
직원 2는 두 개의 이벤트가 있습니다: 2020-11-28에 한 개의 이벤트가 있으며, 총 시간은 (33 - 3) = 30이고, 2020-12-09에 한 개의 이벤트가 있으며, 총 시간은 (74 - 47) = 27입니다.

 

✏️ 풀이

import pandas as pd

def total_time(employees: pd.DataFrame) -> pd.DataFrame:
    employees['in_out_time'] = employees['out_time'] - employees['in_time']

    result = employees.groupby(['emp_id', 'event_day'])['in_out_time'].sum().reset_index(name='total_time')

    return result[['event_day', 'emp_id', 'total_time']].rename(columns={'event_day': 'day'})