본문 바로가기

[LeetCode] 1407. Top Travellers

by qwee0328 2025. 3. 6.

📝 1407. Top Travellers

🔹 최고의 여행자

각 사용자가 이동한 거리를 보고하는 솔루션을 작성하세요.
travelled_distance 기준으로 정렬된 결과 테이블을 내림차순으로 반환하고, 두 명 이상의 사용자가 동일한 거리를 이동한 경우 이름을 기준으로 오름차순으로 정렬합니다.

 

 

📝 문제 설명

Top Travellers(1407번) 문제는 사용자가 이동한 총 거리를 계산하여 순위를 매기는 문제입니다. 각 사용자의 이동 거리 합계를 계산하고, 이동 거리 기준으로 내림차순으로 정렬합니다. 만약 이동 거리가 동일한 사용자가 있다면 이름 기준 오름차순으로 정렬합니다.

 

📊 테이블 구조

Users 테이블

Column Name Type
id int
name varchar

 

Rides 테이블

Column Name Type
id int
user_id int
distance int
  • id는 테이블의 PK 입니다.
  • user_id는 distance거리를 이동한 사용자의 id입니다.

 

💡 SQL 문제 해결 방법

  1. JOIN을 사용하여 Users 테이블과 Rides 테이블을 연결합니다.
  2. SUM 함수를 사용하여 사용자가 이동한 총거리를 계산합니다.
  3. IFNULL 또는 COALESCE 함수를 사용하여 이동 기록이 없는 사용자의 거리를 0으로 반환합니다.
  4. GROUP BY 절을 사용하여 사용자별로 이동 거리를 집계합니다.
  5. ORDER BY 절을 사용하여 이동 거리 기준 내림차순 정렬 후, 같은 거리는 이름 기준 오름차순으로 정렬합니다.

 

728x90

 

🖥️ SQL 풀이

   SELECT a.name
        , IFNULL(SUM(b.distance), 0) AS travelled_distance
     FROM Users a
LEFT JOIN Rides b
       ON a.id = b.user_id
 GROUP BY a.id
 ORDER BY travelled_distance DESC
        , a.name

 

 

🔍 쿼리 분석

  • LEFT JOIN을 사용하여 Users 테이블의 모든 사용자 정보를 포함합니다.
  • SUM(b.distance)를 사용하여 사용자가 이동한 총 거리를 계산합니다.
  • 이동 기록이 없는 사용자는 IFNULL 함수를 사용하여 이동 거리를 0으로 반환합니다.
  • 결과는 이동 거리 기준 내림차순, 이름 기준 오름차순으로 정렬됩니다.

 

📌 실행 예제

📊 입력 데이터

Users 테이블

id name
1 Alice
2 Bob
3 Alex
4 Donald
7 Lee
13 Jonathan
19 Elvis

 

Rides 테이블

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

 

쿼리 실행 결과

name travelled_distance
Elvis 450
Lee 450
Bob 317
Jonathan 312
Alex 222
Alice 120
Donald 0
  • Elvis와 Lee는 각각 450마일을 이동했으며, 이름 순으로 정렬되어 Elvis가 1위입니다.
  • Bob, Jonathan, Alex, Alice는 각각 한 번의 이동만 기록되었고 이동 거리 순으로 정렬됩니다.
  • Donald는 이동 기록이 없어 이동 거리 0으로 표시됩니다.

 

🎯 결론

이 문제는 JOIN 절과 집계 함수를 활용하여 데이터 집계를 수행하는 방법을 연습할 수 있습니다. 이동 거리 계산과 정렬 조건을 함께 적용하여 SQL의 다양한 기능을 익힐 수 있습니다.

 

 


 

 

더 많은 SQL 문제 풀이를 보고 싶다면 LeetCode SQL 문제 모음을 확인해 보세요! 🚀

728x90
반응형