https://www.hackerrank.com/challenges/full-score/problem?isFullScreen=true
Top Competitors | HackerRank
Query a list of top-scoring hackers.
www.hackerrank.com
📌 문제 목표
- 해커 대회에서 2개 이상 문제에서 만점을 받은 해커만 뽑아 리더 보드를 출력
- 출력 형식: hacker_id, name
- 정렬:
1. 만점 문제수 내림차순
2. 동점 시 hacker_id 오름차순
📌 문제 해결 접근 과정
1. Submissions의 점수와 Difficulty의 만점을 비교.
2. 만점 여부 판별
- 해커가 문제에 여러번 제출할 수 있으므로, max(s.score)를 사용해 해커별,문제별 최고 점수를 확인
- 그 최고 점수가 Difficulty.score와 같으면 해당 문제에서 만점 획득
SELECT
s.hacker_id,
s.challenge_id
FROM
Submissions AS s
JOIN Challenges AS c ON s.challenge_id = c.challenge_id
JOIN Difficulty AS d ON c.difficulty_level = d.difficulty_level
GROUP BY
s.hacker_id, s.challenge_id, d.score
HAVING
MAX(s.score) = d.score
👉 결과: (해커, 문제) 쌍 = 해커가 만점을 받은 문제 목록
3. 해커 이름과 합치기 + 정렬
- Hackers 테이블과 JOIN -> 해커 이름 붙이기-> 2개 이상 만점인 경우 필터링-> 정렬
- count(*)는 해커가 만점을받은 서로 다른 문제 수를 의미합니다.
SELECT
h.hacker_id,
h.name
FROM Hackers AS h
JOIN(
--위 쿼리 )
AS full_marks
ON h.hacker_id = full_marks.hacker_id
GROUP BY
h.hacker_id, h.name
HAVING
COUNT(*)>1
[최종 작성 쿼리]
SELECT
h.hacker_id,
h.name
FROM Hackers AS h
JOIN (SELECT
s.hacker_id,
s.challenge_id
FROM
Submissions AS s
JOIN Challenges AS c ON s.challenge_id = c.challenge_id
JOIN Difficulty AS d ON c.difficulty_level = d.difficulty_level
GROUP BY
s.hacker_id, s.challenge_id, d.score
HAVING
MAX(s.score) = d.score
) AS full_marks
ON h.hacker_id = full_marks.hacker_id
GROUP BY
h.hacker_id, h.name
HAVING
COUNT(*)>1
ORDER BY COUNT(*) DESC, hacker_id ASC;
[한눈에 풀이 보기 정리]
- full_marks 서브쿼리: 해커가 만점을 받은 (hacker_id, challenge_id) 쌍만 추림
- 바깥쪽 쿼리: GROUP BY h.hacker_id, h.name을 해서 해커별로 묶음
- 그 결과 COUNT(*) = 해당 해커가 만점을 받은 문제 수
- HAVING COUNT(*) > 1 → 두 문제 이상 만점 받은 해커만 필터
- 마지막 ORDER BY COUNT(*) DESC, h.hacker_id ASC → 요구된 순서대로 정렬
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [Hacker Rank] SQL Intermediate 'Symmetric Pairs' (Medium) (4) | 2025.08.22 |
|---|---|
| [Hacker Rank] SQL Intermediate 'Contest Leaderboard' (Medium) (0) | 2025.08.22 |
| [Hacker Rank] SQL Intermediate 'The Report' (Medium) (0) | 2025.08.22 |
| [Hacker Rank] SQL Intermediate 'Weather Observation Station 5'(Medium) (0) | 2025.08.22 |
| [Hacker Rank] SQL Intermediate 'Placemants' (Medium) (1) | 2025.08.18 |