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에서 컬럼에 맞게 순차적으로 써주면 된다
'[코딩테스트] > [Pandas]' 카테고리의 다른 글
[LeetCode - Pandas] (Easy) 1581. Customer Who Visited but Did Not Make Any Transactions (0) | 2025.04.15 |
---|---|
[LeetCode - Pandas] (Easy) 1587. Bank Account Summary II (0) | 2025.04.14 |
[LeetCode - Pandas] (Easy) 1661. Average Time of Process per Machine (0) | 2025.04.11 |
[LeetCode - Pandas] 1667. Fix Names in a Table (0) | 2025.04.11 |
[LeetCode - Pandas] (Easy) 1683. Invalid Tweets (0) | 2025.04.10 |