[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1407. Top Travellers

잰잰' 2025. 4. 17. 10:19
Table: Users

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

id는 이 테이블에서 고유한 값을 가진 열입니다. name은 사용자의 이름입니다.

Table: Rides

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| user_id       | int     |
| distance      | int     |
+---------------+---------+

id는 이 테이블에서 고유한 값을 가진 열입니다. user_id는 "distance" 거리를 이동한 사용자의 id입니다.

 

문제

각 사용자가 이동한 거리의 보고서를 작성하세요.

결과 테이블은 이동한 거리(travelled_distance)를 내림차순으로 정렬하고, 두 명 이상의 사용자가 동일한 거리를 이동한 경우 이름을 오름차순으로 정렬하세요.

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

Example 1:

Input: 
Users table:
+------+-----------+
| id   | name      |
+------+-----------+
| 1    | Alice     |
| 2    | Bob       |
| 3    | Alex      |
| 4    | Donald    |
| 7    | Lee       |
| 13   | Jonathan  |
| 19   | Elvis     |
+------+-----------+
Rides table:
+------+----------+----------+
| id   | user_id  | distance |
+------+----------+----------+
| 1    | 1        | 120      |
| 2    | 2        | 317      |
| 3    | 3        | 222      |
| 4    | 7        | 100      |
| 5    | 13       | 312      |
| 6    | 19       | 50       |
| 7    | 7        | 120      |
| 8    | 19       | 400      |
| 9    | 7        | 230      |
+------+----------+----------+
Output: 
+----------+--------------------+
| name     | travelled_distance |
+----------+--------------------+
| Elvis    | 450                |
| Lee      | 450                |
| Bob      | 317                |
| Jonathan | 312                |
| Alex     | 222                |
| Alice    | 120                |
| Donald   | 0                  |
+----------+--------------------+

설명 : Elvis와 Lee는 각각 450마일을 이동했으며, Elvis가 이름이 알파벳 순으로 더 작기 때문에 가장 많은 거리를 이동한 사람으로 간주됩니다. Bob, Jonathan, Alex, Alice는 각각 한 번의 여행만 했으며, 우리는 그들의 총 이동 거리로만 정렬합니다. Donald는 여행이 없었으므로 이동한 거리는 0입니다.

 

✏️ 풀이

import pandas as pd

def top_travellers(users: pd.DataFrame, rides: pd.DataFrame) -> pd.DataFrame:
    df = rides.groupby('user_id')['distance'].sum().reset_index(name='travelled_distance')

    result = pd.merge(df, users, how='right', left_on='user_id', right_on='id').fillna(0)

    return result[['name', 'travelled_distance']].sort_values(by=['travelled_distance', 'name'], ascending=[False, True])

 

지금까지 공부한 내용으로 충분히 풀 수 있는 문제여서 어렵지 않게 풀 수 있었다