Prepare > SQL > Basic Join > Top Competitors
Top Competitors | HackerRank
Query a list of top-scoring hackers.
www.hackerrank.com
문제
Julia just finished conducting a coding contest, and she needs your help assembling the leaderboard! Write a query to print the respective hacker_id and name of hackers who achieved full scores for more than one challenge. Order your output in descending order by the total number of challenges in which the hacker earned a full score. If more than one hacker received full scores in same number of challenges, then sort them by ascending hacker_id.
=> 줄리아를 도와 코딩 콘테스트의 리더보드를 만들자.
한 개 이상의 문제에서 만점을 받은 해커들 각각의 id와 이름을 쿼리하라. 많이 맞춘 문제 수, 해커id 기준 정렬.
H: 참가자명, 참가id
D: 난이도, 난이도에 따른 배점 (중요! 사실상 문제 난이도의 만점임을 알 수 있음)
C: 문제id, 문제낸 사람 id, 난이도
S: 답id, 제출한 사람id, 문제id, 점수
문제이해
- 리더보드: Leaderboard(리더보드)란? Leaderboard(리더보드)란? Leaderboard에서는 List(리스트)나 Search(검색)의 프로필, 페이지, 계정 또는 서브레딧이 각각에 대해 상대적으로 어떤 성과를 올리고 있는지 확인할 수 있습니다.
- 코딩 콘테스트: 해커(참가자) 각각이 문제(challenge)를 내기도 하고, 풀기도 함
- 여러 문제들 중 만점을 두 개 이상 받은 해커를 쿼리하는 문제. 물론 각 케이스별로 정렬 기준은 문제에 있음
코드
SELECT S.hacker_id,
H.name
FROM SUBMISSIONS AS S
LEFT JOIN HACKERS AS H ON S.hacker_id = H.hacker_id
LEFT JOIN CHALLENGES AS C ON S.challenge_id = C.challenge_id
LEFT JOIN DIFFICULTY AS D ON C.difficulty_level = D.difficulty_level
WHERE D.score = S.score
GROUP BY S.hacker_id, H.name
HAVING COUNT(S.score) > 1
ORDER BY COUNT(S.challenge_id) DESC, S.hacker_id;
노트
- JOIN 의 기준(on 뒷 부분) 을 잡을 때 Submissions를 많이 쓰게 됨
- 여러 해커들 중 맞힌 문제가 2개 이상인 놈들을 고를 때 쓰는게 group by 인데, 그걸 submissions에서 잡고 count 함
대충 다 때려 넣은 테이블 만들기
SELECT *
FROM SUBMISSIONS AS S
LEFT JOIN HACKERS AS H ON S.hacker_id = H.hacker_id
LEFT JOIN CHALLENGES AS C ON S.challenge_id = C.challenge_id
LEFT JOIN DIFFICULTY AS D ON C.difficulty_level = D.difficulty_level
- C.hacker_id 는 문제를 만든 해커의 id임을 주의
만점받은
SELECT *
FROM SUBMISSIONS AS S
LEFT JOIN HACKERS AS H ON S.hacker_id = H.hacker_id
LEFT JOIN CHALLENGES AS C ON S.challenge_id = C.challenge_id
LEFT JOIN DIFFICULTY AS D ON C.difficulty_level = D.difficulty_level
WHERE D.score = S.score
만점받은 제출작이 두 개 이상인
SELECT S.hacker_id,
H.name
FROM SUBMISSIONS AS S
LEFT JOIN HACKERS AS H ON S.hacker_id = H.hacker_id
LEFT JOIN CHALLENGES AS C ON S.challenge_id = C.challenge_id
LEFT JOIN DIFFICULTY AS D ON C.difficulty_level = D.difficulty_level
WHERE D.score = S.score
GROUP BY S.hacker_id, H.name
HAVING COUNT(S.challenge_id) > 1
- 정렬만 해주면 끝
두 번째 시도
SELECT S.hacker_id, H.name
FROM SUBMISSIONS AS S INNER JOIN HACKERS AS H ON S.hacker_id = H.hacker_id
INNER JOIN CHALLENGES AS C ON S.challenge_id = C.challenge_id
INNER JOIN DIFFICULTY AS D ON C.difficulty_level = D.difficulty_level AND S.SCORE = D.SCORE
GROUP BY S.hacker_id, H.name
HAVING COUNT(S.challenge_id) > 1
ORDER BY COUNT(S.challenge_id) DESC, S.hacker_id;id;
- 만점 조건을, INNER과 S.SCORE = D.SCORE 로 씀. 근데 WHERE 쓰는게 편한듯...