https://www.hackerrank.com/challenges/challenges/problem?isFullScreen=true

 

Challenges | HackerRank

Print the total number of challenges created by hackers.

www.hackerrank.com

코드설명

INNER JOIN + SUBQUERY + MAX + COUNT + GROUP BY 를 활용합니다.

 

좋은 문제입니다.

 

1. 가장 최대값의 문제 개수를 구합니다.

SELECT MAX(CHALLENGE_COUNT) FROM(
    SELECT COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT FROM CHALLENGES GROUP BY HACKER_ID)

 

2. 빈도수가 1개인 것들의 개수를 구합니다. 

중요한 부분입니다. 빈도수를 다시 GROUP BY 해서 1번만 나오는 것들을 GROUP BY 하는 것 입니다.

(SELECT CHALLENGE_COUNT
FROM (SELECT HACKER_ID, COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT
FROM CHALLENGES
GROUP BY HACKER_ID)
GROUP BY CHALLENGE_COUNT
HAVING COUNT(*) = 1)

 

3. 기본 INNER JOIN한 코드입니다. 가능한 모든 조합이 나옵니다.

SELECT H.HACKER_ID, H.NAME, COUNT(C.CHALLENGE_ID)
FROM HACKERS H
INNER JOIN CHALLENGES C
ON H.HACKER_ID = C.HACKER_ID
GROUP BY H.HACKER_ID, H.NAME

 

4. 1번과 2번 코드를 COUNT(C.CHALLENGE_ID)에 합쳐줍니다.

이때 중요점은, COUNT(C.CHALLENGE_ID) 즉 문제를 낸 횟수가 최대횟수이거나 OR 빈도수가 1번 나오는 것들.

이렇게 2가지 경우의 경우 모두 TRUE를 반환하며 출력합니다. 최대횟수와 1이 만약 겹치는 경우를 걱정할 수 있지만, 그중 1개라도 겹치면 바로 출력됩니다.

SELECT H.HACKER_ID, H.NAME, COUNT(C.CHALLENGE_ID)
FROM HACKERS H
INNER JOIN CHALLENGES C
ON H.HACKER_ID = C.HACKER_ID
GROUP BY H.HACKER_ID, H.NAME
HAVING COUNT(C.CHALLENGE_ID) = (SELECT MAX(CHALLENGE_COUNT) FROM(
    SELECT COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT FROM CHALLENGES GROUP BY HACKER_ID) )
    OR COUNT(C.CHALLENGE_ID) IN (SELECT CHALLENGE_COUNT
FROM (SELECT HACKER_ID, COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT
FROM CHALLENGES
GROUP BY HACKER_ID)
GROUP BY CHALLENGE_COUNT
HAVING COUNT(*) = 1)
ORDER BY COUNT(C.CHALLENGE_ID) DESC, H.HACKER_ID ASC;

 

ORACLE 코드

정답코드1입니다.

SELECT H.HACKER_ID, H.NAME, COUNT(C.CHALLENGE_ID)
FROM HACKERS H
INNER JOIN CHALLENGES C
ON H.HACKER_ID = C.HACKER_ID
GROUP BY H.HACKER_ID, H.NAME
HAVING COUNT(C.CHALLENGE_ID) = (SELECT MAX(CHALLENGE_COUNT) FROM(
    SELECT COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT FROM CHALLENGES GROUP BY HACKER_ID) )
    OR COUNT(C.CHALLENGE_ID) IN (SELECT CHALLENGE_COUNT
FROM (SELECT HACKER_ID, COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT
FROM CHALLENGES
GROUP BY HACKER_ID)
GROUP BY CHALLENGE_COUNT
HAVING COUNT(*) = 1)
ORDER BY COUNT(C.CHALLENGE_ID) DESC, H.HACKER_ID ASC;

+ Recent posts