해커랭크 [Contest Leaderboard]

윤태영·2024년 8월 28일
0
post-thumbnail

문제

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

줄리아가 코딩 콘테스트를 주최했다. 해커의 총 점수는 모든 챌린지에 대한 최대 점수의 합계이며, 총 점수를 기준으로 내림차순하여 hacker_id, name, score를 출력하는 쿼리를 작성하자. 하지만 만약 두명 이상의 해커가 동일한 점수를 얻었을 경우에는 hacker_id를 기준으로 오름차순하여 결과를 정렬하고, 총 점수가 0점인 해커의 결과는 제외시키자.

INPUT FORMAT

TABLE NAME : Hackers

TABLE NAME : Submissions

SAMPLE INPUT

Sample Output

문제풀이

1) 궁극적으로 구하고 싶은건 모든 챌린지에 대한 최대 점수의 합계값이지만 먼저 maximum scores를 구하자.

  • 한명의 해커는 여러개의 챌린지를 진행할 수 있고, 같은 챌린지 아이디여도 여러명의 해커가 도전할 수 있다.
  • GROUP BY hacker_id, challenge_id를 해서 동일한 hacker_id 가 여러번 진행한 challenge_id 중 MAX값을 구한다.

2) 앞선 단계에서 구한 것을 FROM절에 넣고 이제 hacker_id 를 기준으로 더해준다.

3) name을 구해야 하니까 name 이 있는 테이블과 조인해주고, 이름도 group by 기준에 넣어준다.

  • 총 점수가 0점인 해커의 결과는 제외시키기 위해 HAVING 절을 써준다.

  • ORDER BY 조건은 total score of the hackers ordered by the DESC, hacker_id ASC

쿼리

SELECT m.hacker_id, h.name, SUM(m.score)AS total 
FROM
     (SELECT hacker_id, challenge_id, MAX(score) AS score 
     FROM Submissions 
     GROUP BY hacker_id, challenge_id) m 
INNER JOIN Hackers h ON h.hacker_id = m.hacker_id  
GROUP BY hacker_id, h.name 
HAVING SUM(m.score) > 0 
ORDER BY total DESC, m.hacker_id 
profile
ice blue

0개의 댓글