문제 사이트
아래 문제는 해커랭크에서 추출해온 문제입니다. 문제의 저작권은 해커랭크에 있으며 문제를 풀어보시려면 아래 링크를 클릭해주세요 🙂
Top Competitors | HackerRank
Query a list of top-scoring hackers.
www.hackerrank.com
👉문제 설명
- 챌린지에서 만점을 두번 이상 받은 hacker_id와 name을 출력
- 만점을 많이 받은 hacker 순으로 출력
- 만점 받은 횟수가 같다면 hacker_id순으로 정렬




👉문제 풀이 과정
- 각 hacker_id 별로 difficulty_level에 해당하는 score를 받은 사람들을 찾아야 함
- 만점 횟수를 계산하여 정렬
- 정렬 기준 :
- 총 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_id와 name 출력
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에서도 쓸 수 있다는 걸 알게 됨.
'SQL > MySQL' 카테고리의 다른 글
[MySQL] HackerRank - The Report 문제 풀이 (0) | 2025.03.24 |
---|---|
[MySQL] HackerRank - Weather Observation Station 20 문제 풀이 (0) | 2025.03.19 |
[MySQL] HackerRank - New Companies 문제 풀이 (0) | 2025.03.12 |
[MySQL] HackerRank - Weather Observation Station 8 문제 풀이 (0) | 2025.02.10 |
[MySQL] HackerRank - Weather Observation Station 7 문제 풀이 (0) | 2025.02.06 |