[오늘의 문제] contest-leaderboard

shlim55·2026년 1월 8일

코딩테스트

목록 보기
211/223

출처: https://www.hackerrank.com/challenges/contest-leaderboard/problem?isFullScreen=true

해커의 총점은 모든 과제에서 얻은 최고 점수의 합입니다. 해커 ID , 이름 , 총점을 점수 순으로 내림차순 정렬하여 출력하는 쿼리를 작성하세요. 총점이 같은 해커가 여러 명인 경우, 해커 ID를 기준으로 오름차순 정렬하세요 . 총점이 0 인 해커는 제외하세요.결과에서.

내가 한 풀이

SELECT h.hacker_id, h.name, SUM(s.score)
From Hackers h
JOIN Submissions s
ON h.hacker_id = s.hacker_id
GROUP BY h.hacker_id, h.name
HAVING SUM(s.score)>= 0 
ORDER BY SUM(s.score) DESC;

트러블 슈팅

우선 맨처음에 GROUP BY절에 두개 컬럼이 들어가야 한다.

SELECT 절에 집계 함수(SUM, AVG 등)를 제외한 컬럼이 있다면, 그 컬럼들은 반드시 GROUP BY 절에 포함되어야 한다.

더 나아가 s.score->SUM(s.score)으로 수정해야 총점을 구한다.

HAVING 절의 비효율성 -> 이것도 > 0 이렇게 수정해야 한다.

그리고 중복 제출 중 최고점만 합산을 하기 위해선 서브 쿼리도 써야 한다.

바뀐 코드문
서브쿼리: 해커별, 문제별 최고 점수만 추출

JOIN (
    SELECT hacker_id, challenge_id, MAX(score) AS max_score
    FROM Submissions
    GROUP BY hacker_id, challenge_id
) s 

전체 코드문

SELECT h.hacker_id, h.name, SUM(max_score) AS total_score
FROM Hackers h
JOIN (
    SELECT hacker_id, challenge_id, MAX(score) AS max_score
    FROM Submissions
    GROUP BY hacker_id, challenge_id
) s
ON h.hacker_id = s.hacker_id
GROUP BY h.hacker_id, h.name
HAVING SUM(max_score) > 0
ORDER BY total_score DESC, h.hacker_id ASC;
profile
A Normal Programmer

0개의 댓글