코딩 테스트/MySQL

[HackerRank] Challenges

알밤바 2025. 8. 5. 12:42
728x90
반응형
 

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		-- 정렬 기준
;
728x90
반응형

'코딩 테스트 > 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