[코딩테스트]/[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위인 직원 조회