Skip to main content
Back to problems
#3182
Medium Database

Find top scoring students

Database
49.8% acceptance
Mar 31, 2026
15
3

No description available.

Solution

Pandas
Time O(1)
Space O(1)
LeetCode
solution.pandas
# Table: students
# 
# +-------------+----------+
# | Column Name | Type     |
# +-------------+----------+
# | student_id  | int      |
# | name        | varchar  |
# | major       | varchar  |
# +-------------+----------+
# student_id is the primary key (combination of columns with unique values) for this table.
# Each row of this table contains the student ID, student name, and their major.
# 
# Table: courses
# 
# +-------------+----------+
# | Column Name | Type     |
# +-------------+----------+
# | course_id   | int      |
# | name        | varchar  |
# | credits     | int      |
# | major       | varchar  |
# +-------------+----------+
# course_id is the primary key (combination of columns with unique values) for this table.
# Each row of this table contains the course ID, course name, the number of credits for the course, and the major it belongs to.
# 
# Table: enrollments
# 
# +-------------+----------+
# | Column Name | Type     |
# +-------------+----------+
# | student_id  | int      |
# | course_id   | int      |
# | semester    | varchar  |
# | grade       | varchar  |
# +-------------+----------+
# (student_id, course_id, semester) is the primary key (combination of columns with unique values) for this table.
# Each row of this table contains the student ID, course ID, semester, and grade received.
# 
# Write a solution to find the students who have taken all courses offered in their major and have achieved a grade of A in all these courses.
# 
# Return the result table ordered by student_id in ascending order.
# 
# The result format is in the following example.
#
# Example 1:
# Input:
# students table:
# +------------+------------------+------------------+
# | student_id | name             | major            |
# +------------+------------------+------------------+
# | 1          | Alice            | Computer Science |
# | 2          | Bob              | Computer Science |
# | 3          | Charlie          | Mathematics      |
# | 4          | David            | Mathematics      |
# +------------+------------------+------------------+
# courses table:
# +-----------+-----------------+---------+------------------+
# | course_id | name            | credits | major            |
# +-----------+-----------------+---------+------------------+
# | 101       | Algorithms      | 3       | Computer Science |
# | 102       | Data Structures | 3       | Computer Science |
# | 103       | Calculus        | 4       | Mathematics      |
# | 104       | Linear Algebra  | 4       | Mathematics      |
# +-----------+-----------------+---------+------------------+
# enrollments table:
# +------------+-----------+----------+-------+
# | student_id | course_id | semester | grade |
# +------------+-----------+----------+-------+
# | 1          | 101       | Fall 2023| A     |
# | 1          | 102       | Fall 2023| A     |
# | 2          | 101       | Fall 2023| B     |
# | 2          | 102       | Fall 2023| A     |
# | 3          | 103       | Fall 2023| A     |
# | 3          | 104       | Fall 2023| A     |
# | 4          | 103       | Fall 2023| A     |
# | 4          | 104       | Fall 2023| B     |
# +------------+-----------+----------+-------+
# Output:
# +------------+
# | student_id |
# +------------+
# | 1          |
# | 3          |
# +------------+
# Explanation:
# Alice (student_id 1) is a Computer Science major and has taken both "Algorithms" and "Data Structures", receiving an 'A' in both.
# Bob (student_id 2) is a Computer Science major but did not receive an 'A' in all required courses.
# Charlie (student_id 3) is a Mathematics major and has taken both "Calculus" and "Linear Algebra", receiving an 'A' in both.
# David (student_id 4) is a Mathematics major but did not receive an 'A' in all required courses.
# Note: Output table is ordered by student_id in ascending order.

import pandas as pd

def find_top_scoring_students(enrollments: pd.DataFrame, students: pd.DataFrame, courses: pd.DataFrame) -> pd.DataFrame:
  # For each student, find courses in their major
  student_courses = students.merge(courses, on='major', how='inner')
  # Count required courses per student
  required_count = student_courses.groupby('student_id')['course_id'].nunique().reset_index(name='required')
  # Filter enrollments with grade A and in-major courses
  a_enrollments = enrollments[enrollments['grade'] == 'A']
  merged = student_courses.merge(a_enrollments, on=['student_id', 'course_id'])
  completed = merged.groupby('student_id')['course_id'].nunique().reset_index(name='completed')
  result = required_count.merge(completed, on='student_id', how='left').fillna(0)
  result = result[result['required'] == result['completed']][['student_id']]
  return result.sort_values('student_id').reset_index(drop=True)