[HackerRank] Challenges Solution

Sunjoo Shin·2020년 8월 21일
0

SQL

목록 보기
1/6
post-thumbnail

📌 HackerRank 'Challenges'


💻 의사코드 이용하기

1st Draft 🎈 문제를 그저 말로 옮긴 수준밖에 안 된다.

hacker_id, name, total # of challenges created by student 구하기
    만약 1명 이상의 학생이 같은 #의 challenge 만들었다면
        hacker_id로 결과 분류
    만약 1명 이상의 학생이 같은 #의 challenge 만들고 max # of challenges보다 작으면
        결과값에서 제외
결과를 total # of challenges desc, hacker_id order로 정렬

2nd Draft 🎈 기준을 바꾸어 재정의 해보았다.

hacker_id, name, count of challenges_created 구하기
    # > Max challenges_created: 불가능
    # = max challenges_created: hacker_id로 결과 분류
    # < max challenges_created: 결과값에서 제외
    그 외는 그대로 적기
결과를 total # of challenges desc, hacker_id order로 정렬

3rd Draft 🎈 코드를 짜기 쉽게 문항을 재해석하였다.

hackers tbl(hacker_id, name), challenges tbl(count of challenges_created)
        challenges_created = MAX(challenges_created): ORDER BY hacker_id
        -- challenges_created가 최대값인 경우에는 여러명이어도 결과에 포함됨
        challenges_created < MAX(challenges_created) & 1명 이상: 결과값 제외
    	그 외(=challenges_created가 최대값이 아니고 1명임)는 그대로 적기
        -- 위 두 문장은 결국 challenges_created가 최대값이 아닌 경우, 
        -- 1명만 challenges_created의 개수를 가진 경우를 count하면 된다는 의미 
ORDER BY challenges_created DESC, hacker_id

다시 정리하자면

SELECT hackers tbl(hacker_id, name)
      ,challenges tbl(count of challenges_created)
       challenges_created = MAX(challenges_created)
       OR
       challenges_created의 count = 1
ORDER BY challenges_created DESC, hacker_id

📝 답안1

SELECT h.hacker_id, h.name, COUNT(*) challenges_created
FROM challenges c
INNER JOIN hackers h ON c.hacker_id = h.hacker_id
GROUP BY h.hacker_id, h.name
HAVING challenges_created = (SELECT MAX(challenges_created)
                             FROM (SELECT hacker_id
                             		 ,COUNT(*) AS challenges_created
                                   FROM challenges 
                                   GROUP BY hacker_id) sub)
OR challenges_created IN (SELECT challenges_created 
                          FROM (SELECT hacker_id
                          	      ,COUNT(*) AS challenges_created
                                FROM challenges 
                                GROUP BY hacker_id) sub
                          GROUP BY challenges_created
                          HAVING count(*)=1)
ORDER BY challenges_created DESC, hacker_id

📝 답안2 - WITH statement

WITH counter AS (SELECT h.hacker_id, h.name, COUNT(*) AS challenges_created
    		 FROM challenges c
             	 INNER JOIN hackers h ON c.hacker_id = h.hacker_id
             	 GROUP BY h.hacker_id, h.name)
SELECT counter.hacker_id, counter.name, counter.challenges_created
FROM counter
WHERE challenges_created = (SELECT MAX(challenges_created) FROM counter)
OR challenges_created IN (SELECT challenges_created
			  FROM counter
                          GROUP BY challenges_created
                          HAVING COUNT(*) = 1)
ORDER BY counter.challenges_created DESC, counter.hacker_id

🏃‍♀️NEXT STEP

글로벌 유저들의 답안 분석하기

profile
Future Data Analyst

0개의 댓글