[HackerRank_MySQL] Top competitors

hyeji·2024년 1월 18일
0

문제

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.
두 개 이상의 챌린지 에서 만점을 달성한 해커의 이름 과 hacker_id를 인쇄하는 쿼리를 작성하세요

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 를 오름차순으로 정렬합니다 .

문제 설명

🏫 다음은 해커의 정보를 담은 *`Hackers`*테이블입니다. `HACKER_ID` : 해커 ID `NAME` : 해커 이름 🏫 다음은 과제의 정보를 담은 *`Difficulty*` 테이블입니다. *`difficult_level*` : 난이도 `score`: 총점(만점 기준) 🏫 다음은 챌린지 정보를 담은 *`Challenges`*테이블입니다. *`challenge_id`*: 챌린지 ID *`hacker_id`*: 챌린지를 만든 해커의 ID 🏫 다음은 과제 제출 정보를 담은 *`Submissions`*테이블입니다. *`submission_id`*: 제출 ID *`hacker_id`*: 제출한 해커의 ID *`challenge_id` :* 챌린지 ID *`score`* : 제출 점수

풀이

  1. 우선 데이터의 스키마를 살펴보자.

챌린지의 난이도를 알기 위해서는 SUBMISSIONS와 CHALLENGES 테이블을 조인해야 하고,

난이도별 만점 여부를 알기 위해서는 CHALLENGES와 DIFFICULTY 테이블을 조인해야 하고,

만점자의 이름을 알기 위해서는 SUBMISSONS와 HACKERS 테이블을 조인해야 한다.
    SELECT S.HACKER_ID, H.NAME
    FROM SUMISSIONS S
    		JOIN CHALLENGES C ON S.CHALLENGE_ID = C.CHALLENGE_ID
    		JOIN DIFFICULTY D ON C.DIFFICULTY_LEVEL = D.DIFFICULTY_LEVEL
    		JOIN HACKERS H ON S.HACKER_ID = H.HACKER_ID
  1. 문제에서 주어진 조건 두 개 이상의 챌린지 에서 만점을 달성 / 만점을 획득한 총 챌린지 수를 기준으로 내림차순 / hacker_id 를 오름차순 을 적어준다.

    SELECT S.HACKER_ID, H.NAME
    FROM SUMISSIONS S
    		JOIN CHALLENGES C ON S.CHALLENGE_ID = C.CHALLENGE_ID
    		JOIN DIFFICULTY D ON C.DIFFICULTY_LEVEL = D.DIFFICULTY_LEVEL
    		JOIN HACKERS H ON S.HACKER_ID = H.HACKER_ID
    WHERE S.SCORE = D.SCORE # 만점을 받은 경우
    GROUP BY S.HACKER_ID, H.NAME # 두 컬럼이 SELECT절에 있으므로 둘 다 적어준다
    HAVING COUNT(SUBMISSION_ID) >= 2 # 두 개 이상의 챌린지
    ORDER BY COUNT(SUBMISSION_ID) DESC, S.HACKER_ID ASC # 정렬

    여기서 S.SCORE는 HACKER가 받은 점수이고, D.SCORE는 만점의 기준임을 알아야 한다.

정답코드

SELECT S.HACKER_ID, H.NAME
FROM SUBMISSIONS S
    JOIN CHALLENGES C ON S.CHALLENGE_ID = C.CHALLENGE_ID
    JOIN DIFFICULTY D ON C.DIFFICULTY_LEVEL = D.DIFFICULTY_LEVEL
    JOIN HACKERS H ON S.HACKER_ID = H.HACKER_ID
WHERE S.SCORE = D.SCORE
GROUP BY S.HACKER_ID, H.NAME
HAVING COUNT(*) >= 2
ORDER BY COUNT(*) DESC, S.HACKER_ID ASC

각 테이블을 어떻게 JOIN할 지만 잘 보면 되는 문제였다(고 생각한다..)

여기서 왜 S.SCORE ≥ D.SCORE는 오답 처리가 되는걸까?

profile
Data Analyst

0개의 댓글