class="layout-aside-right paging-number">
본문 바로가기
TIL

[TIL153] HackerRank - SQL

by heestory323 2026. 6. 18.

HackerRank - Challenges

문제

Julia가 학생들에게 코딩 문제(Challenge)를 만들게 했다.

각 해커가 만든 문제 수를 구한 뒤 아래 조건에 맞는 해커만 출력하시오.

출력 컬럼

hacker_id
name
total_challenges

 


정렬 조건

challenge 수 DESC
hacker_id ASC

출력 조건

1.가장 많은 challenge를 만든 해커는 무조건 출력

2.challenge 수가 유일한 경우 출력

3.challenge 수가 같은 사람이 여러 명이면 제거
(단,최대 challenge 수는 예외)

 

내가 작성한 코드

WITH c AS (
    SELECT
        c.hacker_id,
        h.name,
        COUNT(c.challenge_id) cnt
    FROM challenges c
    JOIN hackers h
        ON h.hacker_id = c.hacker_id
    GROUP BY c.hacker_id, h.name
)

SELECT
    hacker_id,
    name,
    cnt
FROM c
WHERE cnt = (
        SELECT MAX(cnt)
        FROM c
)
OR cnt IN (
        SELECT cnt
        FROM c
        GROUP BY cnt
        HAVING COUNT(*) = 1
)
ORDER BY cnt DESC, hacker_id ASC;

생각 흐름

Step 1. 해커별 challenge 수 집계

먼저 해커별로 몇 개의 challenge를 만들었는지 구한다.

COUNT(challenge_id)

Step 2. 최대 challenge 수 찾기

SELECT MAX(cnt)
FROM c

최대 challenge 수는 무조건 출력해야 하므로

cnt = (
    SELECT MAX(cnt)
    FROM c
)

사용


Step 3. 유일한 challenge 수 찾기

문제 핵심

우리가 궁금한 것

8개 만든 사람이 몇 명인가?
5개 만든 사람이 몇 명인가?

따라서

GROUP BY cnt

를 해야 한다.


Step 4. challenge 수가 유일한 cnt 찾기

SELECT cnt
FROM c
GROUP BY cnt
HAVING COUNT(*) = 1

Step 5. 최종 필터링

WHERE
    최대 challenge 수
OR
    유일한 challenge 수
    
___ 

서브쿼리 값 하나 → =
값 여러 개 가능 → IN

 


WHERE cnt = (
        SELECT MAX(cnt)
        FROM c
)
OR cnt IN (
        SELECT cnt
        FROM c
        GROUP BY cnt
        HAVING COUNT(*) = 1
)

필요한 개념

핵심 한 줄

이 문제의 핵심은 GROUP BY hacker_id로 challenge 수를 구한 뒤, 그 결과를 다시 GROUP BY cnt 하여 challenge 수의 중복 여부를 확인하는 것이다. 즉 "집계 결과를 다시 집계하는 이중 집계 패턴" 문제다.