본문 바로가기
Data Analysis/Query

리트코드 : 1633. Percentage of Users Attended a Contest

by 베짱이28호 2024. 8. 31.

리트코드 : 1633. Percentage of Users Attended a Contest


문제

Table: Users

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| user_name   | varchar |
+-------------+---------+
user_id is the primary key (column with unique values) for this table.
Each row of this table contains the name and the id of a user.


Table: Register

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| contest_id  | int     |
| user_id     | int     |
+-------------+---------+
(contest_id, user_id) is the primary key (combination of columns with unique values) for this table.
Each row of this table contains the id of a user and the contest they registered into.


Write a solution to find the percentage of the users registered in each contest rounded to two decimals.

Return the result table ordered by percentage in descending order. In case of a tie, order it by contest_id in ascending order.

The result format is in the following example.



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      |
+------------+------------+
Explanation: 
All the users registered in contests 208, 209, and 210. The percentage is 100% and we sort them in the answer table by contest_id in ascending order.
Alice and Alex registered in contest 215 and the percentage is ((2/3) * 100) = 66.67%
Bob registered in contest 207 and the percentage is ((1/3) * 100) = 33.33%
  • 구할거

문제 풀이

MySQL

SELECT contest_id, round(100*count(*)/ (select count(*) from users),2) as percentage
FROM register
GROUP BY contest_id
ORDER BY percentage DESC, contest_id ASC
  • 전체 개수는 users에서 세준다.
  • 나머지는 GROUP BY + ORDER BY로 카운팅

Pandas

import pandas as pd

def users_percentage(users: pd.DataFrame, register: pd.DataFrame) -> pd.DataFrame:

    n = len(users)

    grouped = register.groupby('contest_id').agg(
        count = ('user_id','count')
    ).reset_index()

    grouped['percentage'] = round(100*grouped['count']/n,2)
    grouped.sort_values(by=['percentage','contest_id'], ascending=[False,True], inplace=True)
    return grouped[['contest_id','percentage']]
  • shape이든 len이든 count든 users 개수를 세준다.
  • 나머지는 group by + sort_values로 정렬해주기.
  • 다중 조건에는 by, ascending에 column, bool 전달해주기

코멘트

  • .

댓글