[해커랭크]Top Competitors

김준석·2024년 2월 2일

코딩테스트 - SQL

목록 보기
49/96

문제

https://www.hackerrank.com/challenges/full-score/problem?isFullScreen=true
중요 포인트.
1. 해커대회에 한번 이상 참여한
2. 해커 중 만점자의 해커아이디와 이름을
3. 참가수가 많은 순으로 정렬

코드

SELECT
    sv.hacker_id,
    sv.name
FROM
    (SELECT
        sub.hacker_id,
        h.name,
        COUNT(*) AS cnt
    FROM
        Hackers h
        INNER JOIN Submissions sub
            ON h.hacker_id=sub.hacker_id
        INNER JOIN Challenges c
            ON sub.challenge_id=c.challenge_id
        INNER JOIN Difficulty d
            ON c.difficulty_level =d.difficulty_level 
    WHERE 1=1
        AND d.score=sub.score
    GROUP BY
        sub.hacker_id,
        h.name
    HAVING 1=1
        AND cnt>1)sv
ORDER BY
    cnt DESC,
    hacker_id

풀이 후기

  1. 테이블 조인 후 필요한 컬럼 추출.
SELECT
    sub.hacker_id,
    h.name,
    COUNT(*) AS cnt
FROM
    Hackers h
    INNER JOIN Submissions sub
        ON h.hacker_id=sub.hacker_id
    INNER JOIN Challenges c
        ON sub.challenge_id=c.challenge_id
    INNER JOIN Difficulty d
        ON c.difficulty_level =d.difficulty_level
GROUP BY
    sub.hacker_id,
    h.name
  1. 조인 이후 Difficulty의 만점 기준과 Submissions의 점수들이 같은 열에 있으므로 조건절에 추가
WHERE 1=1
    AND d.score=sub.score
  1. more than one challenge라고 해서 1개 이상 챌린지에 참여한 사람인 줄 알았는데 1개를 초과한이란다;;;;;
    그래서 HAVING 절에 해당 필터링 추가.
    그룹화 후의 데이터를 필터링 하기 떄문에 HAVING절에 해야 됨.
    HAVING 1=1
        AND cnt>1

4.이후 서브쿼리로 넣고 필요한 컬럼만 추출 및 정렬

SELECT
    sv.hacker_id,
    sv.name
FROM
    (SELECT
        sub.hacker_id,
        h.name,
        COUNT(*) AS cnt
    FROM
        Hackers h
        INNER JOIN Submissions sub
            ON h.hacker_id=sub.hacker_id
        INNER JOIN Challenges c
            ON sub.challenge_id=c.challenge_id
        INNER JOIN Difficulty d
            ON c.difficulty_level =d.difficulty_level 
    WHERE 1=1
        AND d.score=sub.score
    GROUP BY
        sub.hacker_id,
        h.name
    HAVING 1=1
        AND cnt>1)sv
ORDER BY
    cnt DESC,
    hacker_id

후.. 이번건 좀 공간지각능력이 필요했다...껄껄껄

0개의 댓글