[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Medium) 184. Department Highest Salary

잰잰' 2025. 5. 29. 12:40
Table: Employee

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+

id는 이 테이블의 기본 키입니다(고유한 값을 가지는 열).
departmentId는 Department 테이블의 ID를 참조하는 외래 키입니다.
이 테이블의 각 행은 직원의 ID, 이름, 급여를 나타냅니다. 또한 해당 직원의 부서 ID도 포함합니다.

Table: Department

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+

id는 이 테이블의 기본 키입니다(고유한 값을 가지는 열).
부서 이름은 NULL이 아님이 보장됩니다.
이 테이블의 각 행은 부서의 ID와 이름을 나타냅니다.

 

문제

각 부서에서 가장 높은 급여를 받는 직원을 찾는 솔루션을 작성하십시오.

결과 테이블은 임의의 순서로 반환됩니다.

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

Example 1:

Input: 
Employee table:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Jim   | 90000  | 1            |
| 3  | Henry | 80000  | 2            |
| 4  | Sam   | 60000  | 2            |
| 5  | Max   | 90000  | 1            |
+----+-------+--------+--------------+
Department table:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+
Output: 
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
| IT         | Max      | 90000  |
+------------+----------+--------+

설명 : Max와 Jim은 둘 다 IT 부서에서 가장 높은 급여를 받고 있으며, Henry는 Sales 부서에서 가장 높은 급여를 받고 있습니다.

 

✏️  풀이

import pandas as pd

def department_highest_salary(employee: pd.DataFrame, department: pd.DataFrame) -> pd.DataFrame:
    result = pd.merge(employee, department, how='inner', left_on='departmentId', right_on='id')

    result['rnk'] = result.groupby('name_y')['salary'].rank(method='dense', ascending=False)

    return result[result['rnk'] == 1].rename(columns={'name_y':'Department', 'name_x':'Employee', 'salary':'Salary'})[['Department', 'Employee', 'Salary']]

1. employee, department 데이터프레임 머지

2. 부서별 급여 순위 부여

3. 부서별 순위가 1위인 직원 조회