쉽게 쉽게

[HackerRank] Challenges 본문

문제풀이/HakerRank

[HackerRank] Challenges

곱마2 2023. 7. 1. 22:53
반응형

1. 문제

해석

  • hacker_id, 이름 및 각 학생이 낸 총 과제 수 출력
  • 총 과제 수를 기준으로 내림차순으로 정렬. 단 한 명 이상의 학생이 동일한 수의 과제를 낸 경우 hacker_id 별로 결과를 정렬
  • 한 명 이상의 학생이 동일한 수의 도전 과제를 냈을 때,  그 수가 최대 도전 횟수면 결과에 포함
  • 최대 도전 횟수보다 적다면 그 학생들은 결과에서 제외

2. 풀이

1. 테이블을 조인하여 id, 이름, 과제 수 출력

SELECT h.hacker_id, h.name , count(*) cnt
FROM Hackers h 
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, name;

2. 정렬

SELECT h.hacker_id, h.name , count(*) cnt
FROM Hackers h 
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, name
ORDER BY cnt DESC , h.hacker_id;

3. 최대 도전 횟수 구하기

SELECT max(num.cnt) 
FROM(
SELECT c.hacker_id , count(*) cnt
FROM Challenges c 
GROUP BY c.hacker_id
) num ;

4. 학생이 제출한 도전 횟수가 중복되지 않은 결과 구하기(중복은 최대 도전 횟수를 빼고는 제거되니까)

SELECT num2.cnt , count(*)
FROM(
SELECT c.hacker_id , count(*) cnt
FROM Challenges c
GROUP BY c.hacker_id    
) num2
GROUP BY num2.cnt
Having count(*) = 1;

5. 통합

SELECT h.hacker_id, h.name , count(*) num3
FROM Hackers h 
JOIN Challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, name
Having num3 = (
    SELECT max(num.cnt) 
    FROM(
    SELECT c.hacker_id , count(*) cnt
    FROM Challenges c 
    GROUP BY c.hacker_id
    ) num)
OR num3 IN(
    SELECT num2.cnt
    FROM(
    SELECT c.hacker_id , count(*) cnt
    FROM Challenges c
    GROUP BY c.hacker_id    
    ) num2 
    GROUP BY num2.cnt
    Having count(*) = 1 ) 
ORDER BY num3 DESC , h.hacker_id;
잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다.

 

 

 

반응형

'문제풀이 > HakerRank' 카테고리의 다른 글

[HackerRank] The PADS  (0) 2023.07.19
[HackerRank] Symmetric Pairs  (0) 2023.07.09
[HackerRank] Placements  (0) 2023.07.03
[HackerRank] Top Competitors  (0) 2023.06.25
[HackerRank] The Report  (0) 2023.06.21