Challenges | HackerRank
Print the total number of challenges created by hackers.
www.hackerrank.com
문제





문제 접근 방식
이 문제는 서브쿼리를 얼마나 잘 활용하는지를 테스트하는 문제이다.
문제에서 요구하는 사항은 다음과 같다
1) 챌린지 수가 같으나 챌린지 수가 가장 큰 수가 아니라면 결과에서 해당되는 학생을 출력하지 않음
→ ① 챌린지 수가 같지 않은 경우 / ② 챌린지 수가 가장 큰 수인 경우 이 2가지를 조건에 걸면 위에 해당하는 학생들을 출력할 수 있음
2) 챌린지 수 내림차순 정렬, 챌린지 수가 동일하면 hacker_id 기준 오름차순 정렬
1) - ① 챌린지 수가 같지 않은 경우 (= 챌린지 수가 중복되지 않은 경우)
학생별로 챌린지 수를 집계한 다음, 챌린지 수 기준으로 몇 명의 학생들이 있는지를 집계한다.
그리고 1명의 학생만 있는 챌린지 수 (CNT)를 HAVING절을 활용하여 출력한다. (→ 챌린지 수를 조건에서 활용할 예정)
SELECT CNT
FROM (
SELECT HACKER_ID, COUNT(1) AS CNT
FROM CHALLENGES
GROUP BY HACKER_ID
) TB
GROUP BY CNT
HAVING COUNT(1) = 1 -- 챌린지 수(CNT)가 1명인 경우
1) - ② 챌린지 수가 가장 큰 수인 경우
위와 동일하게 학생별로 챌린지 수를 집계한 다음, 챌린지 수의 최댓값 (MAX)을 가져온다.
SELECT MAX(TB.CNT)
FROM (
SELECT HACKER_ID, COUNT(1) AS CNT
FROM CHALLENGES
GROUP BY HACKER_ID
) TB
위의 쿼리를 반영하여 전체 쿼리를 작성하면 된다.
1) HACKER_ID, NAME, CHALLENGE_CREATED 출력 (SELECT 절)
2) HACKERS와 CHALLENGES 테이블 조인 (HACKER_ID 키값)
3) HAVING 절을 활용하여 CHALLENGE_CREATED (챌린지 수)가 중복되지 않거나, 가장 큰 수인 경우만 출력 - 서브쿼리 활용
4) ORDER BY 절에서 CHALLENGE_CREATED 기준 내림차순, HACKER_ID 기준 오름차순 정렬
SELECT A1.HACKER_ID, A1.NAME, COUNT(A2.CHALLENGE_ID) AS CHALLENGES_CREATED
FROM HACKERS A1
INNER JOIN CHALLENGES A2
ON A1.HACKER_ID = A2.HACKER_ID
GROUP BY A1.HACKER_ID, A1.NAME
HAVING (CHALLENGES_CREATED IN (SELECT CNT
FROM (
SELECT HACKER_ID, COUNT(1) AS CNT
FROM CHALLENGES
GROUP BY HACKER_ID
) TB
GROUP BY CNT
HAVING COUNT(1) = 1
)) -- ① 챌린지 수가 같지 않은 경우
OR
(CHALLENGES_CREATED IN (SELECT MAX(TB.CNT)
FROM (
SELECT HACKER_ID, COUNT(1) AS CNT
FROM CHALLENGES
GROUP BY HACKER_ID
) TB
)) -- ② 챌린지 수가 가장 큰 수인 경우
ORDER BY COUNT(A2.CHALLENGE_ID) DESC, A1.HACKER_ID -- 정렬 기준
;'코딩 테스트 > MySQL' 카테고리의 다른 글
| [HackerRank] SQL Project Planning (1) | 2025.08.07 |
|---|---|
| [HackerRank] Contest Leaderboard (3) | 2025.08.06 |
| [HackerRank] The PADS (2) | 2025.07.30 |
| [HackerRank] Ollivander's Inventory (2) | 2025.07.29 |
| [HackerRank] Top Competitors (2) | 2025.07.28 |