[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1633. Percentage of Users Attended a Contest

잰잰' 2025. 4. 14. 12:58
Table: Users

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| user_name   | varchar |
+-------------+---------+

user_id는 이 테이블의 기본 키(고유한 값이 있는 열)입니다.
이 테이블의 각 행은 사용자의 이름과 ID를 포함합니다.

Table: Register

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| contest_id  | int     |
| user_id     | int     |
+-------------+---------+

(contest_id, user_id)는 이 테이블의 기본 키(고유한 값이 있는 열의 조합)입니다.
이 테이블의 각 행은 사용자의 ID와 그들이 등록한 대회의 정보를 포함합니다.

 

문제

각 대회에 등록한 사용자들의 비율을 소수점 두 자리까지 계산하세요.

결과 테이블은 비율을 내림차순으로 정렬하고, 만약 비율이 같다면 contest_id를 오름차순으로 정렬하여 반환하세요.

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

Example 1:

Input: 
Users table:
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 6       | Alice     |
| 2       | Bob       |
| 7       | Alex      |
+---------+-----------+
Register table:
+------------+---------+
| contest_id | user_id |
+------------+---------+
| 215        | 6       |
| 209        | 2       |
| 208        | 2       |
| 210        | 6       |
| 208        | 6       |
| 209        | 7       |
| 209        | 6       |
| 215        | 7       |
| 208        | 7       |
| 210        | 2       |
| 207        | 2       |
| 210        | 7       |
+------------+---------+
Output: 
+------------+------------+
| contest_id | percentage |
+------------+------------+
| 208        | 100.0      |
| 209        | 100.0      |
| 210        | 100.0      |
| 215        | 66.67      |
| 207        | 33.33      |
+------------+------------+

설명 :

- 모든 사용자가 대회 208, 209, 210에 등록했습니다. 비율은 100%이고, 결과 테이블에서 contest_id를 오름차순으로 정렬하여 반환합니다.

- Alice와 Alex는 대회 215에 등록했으며, 비율은 **((2/3) * 100) = 66.67%**입니다.

- Bob은 대회 207에 등록했으며, 비율은 **((1/3) * 100) = 33.33%**입니다.

 

✏️ 풀이

import pandas as pd

def users_percentage(users: pd.DataFrame, register: pd.DataFrame) -> pd.DataFrame:
    result = register.groupby('contest_id')['user_id'].nunique().reset_index(name='cnt')
    result['percentage'] = round(result['cnt'] / len(users) * 100, 2)
    result.sort_values(by = ['percentage', 'contest_id'], ascending = (False, True), inplace=True)

    return result[['contest_id', 'percentage']]

users_percentae에서 users랑 register 두 개의 인자를 받는다

제대로 안보고 풀어서 계속 users로만 groupby를 해서 에러가 나서 한참을 해멨다

정렬은 한 개 이상도 가능하고 ascending에서 컬럼에 맞게 순차적으로 써주면 된다