본문 바로가기
SQL/MySQL

[MySQL] HackerRank - Top Competitors 문제 풀이

by 취준생 져니 2025. 3. 13.

문제 사이트

아래 문제는 해커랭크에서 추출해온 문제입니다. 문제의 저작권은 해커랭크에 있으며 문제를 풀어보시려면 아래 링크를 클릭해주세요 🙂


 

Top Competitors | HackerRank

Query a list of top-scoring hackers.

www.hackerrank.com

 

 


 

 

 

👉문제 설명

  • 챌린지에서 만점을 두번 이상 받은 hacker_id와 name을 출력
  • 만점을 많이 받은 hacker 순으로 출력
  • 만점 받은 횟수가 같다면 hacker_id순으로 정렬
순서대로 Hackers, Difficulty, Challenges, Submissions

 

 

 

 

 

 

 

👉문제 풀이 과정

  1. 각 hacker_id 별로 difficulty_level에 해당하는 score를 받은 사람들을 찾아야 함
  2. 만점 횟수를 계산하여 정렬
  3. 정렬 기준 :
  • 총 full score 횟수가 많은 순 (내림차순)
  • 같다면 hacker_id (오름차순)

 

 

👉문제 풀이 과정

1. 각 테이블을 조인한 후 difficulty_level에 해당하는 score를 받은 사람들 추출

SELECT s.hacker_id, h.name
FROM Submissions s
JOIN Hackers h ON s.hacker_id = h.hacker_id
JOIN Challenges c ON s.challenge_id = c.challenge_id
JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
WHERE d.score = s.score
  • 만점 점수와 동일한 점수를 받은 hacker_idname 출력

 

 

2. 각 해커가 full score를 받은 challenge 개수 세기

GROUP BY h.hacker_id, h.name
HAVING COUNT(s.challenge_id) > 1
  • hacker_id 별로 만점 받은 challenge_id 개수를 세서 1보다 큰 경우만 추출

 

3. 출력 조건에 맞게 정렬

ORDER BY COUNT(s.challenge_id) DESC, s.hacker_id ASC;
  • full score 횟수 기준 내림차순, 같은 경우 hacker_id 오름차순.

 

 

 

 

👉최종 답안 

SELECT s.hacker_id, h.name
FROM Submissions s
JOIN Hackers h ON s.hacker_id = h.hacker_id
JOIN Challenges c ON s.challenge_id = c.challenge_id
JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
WHERE d.score = s.score
GROUP BY h.hacker_id, h.name
HAVING COUNT(s.challenge_id) > 1
ORDER BY COUNT(s.challenge_id) DESC, s.hacker_id ASC;

 

 

 

 

 

 

👉고찰

집계함수를 Select 절에서만 쓸 수 있는 줄 알았는데 HAVING절에서도 쓸 수 있고 ORDER BY에서도 쓸 수 있다는 걸 알게 됨.