[Hacker Rank] SQL Intermediate 'Top Competitors' (Medium)

2025. 8. 22. 17:23·코딩 테스트/02. SQL

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

 

Top Competitors | HackerRank

Query a list of top-scoring hackers.

www.hackerrank.com

📌 문제 목표

  • 해커 대회에서 2개 이상 문제에서 만점을 받은 해커만 뽑아 리더 보드를 출력
  • 출력 형식: hacker_id, name
  • 정렬:
    1. 만점 문제수 내림차순
    2. 동점 시 hacker_id 오름차순

📌 문제 해결 접근 과정

1. Submissions의 점수와 Difficulty의 만점을 비교.

2. 만점 여부 판별

  • 해커가 문제에  여러번 제출할 수  있으므로, max(s.score)를 사용해 해커별,문제별 최고 점수를 확인
  • 그 최고 점수가 Difficulty.score와 같으면 해당 문제에서 만점 획득
SELECT 
    s.hacker_id, 
    s.challenge_id
FROM 
    Submissions AS s
    JOIN Challenges AS c ON s.challenge_id = c.challenge_id
    JOIN Difficulty AS d ON c.difficulty_level = d.difficulty_level
GROUP BY 
    s.hacker_id, s.challenge_id, d.score
HAVING 
    MAX(s.score) = d.score

👉 결과: (해커, 문제) 쌍 = 해커가 만점을 받은 문제 목록


 

3. 해커 이름과 합치기 + 정렬

  • Hackers 테이블과 JOIN -> 해커 이름 붙이기-> 2개 이상 만점인 경우 필터링-> 정렬
  • count(*)는 해커가 만점을받은 서로 다른 문제 수를 의미합니다.
SELECT 
    h.hacker_id,
    h.name
FROM Hackers AS h
	JOIN(
--위 쿼리    )
AS full_marks
ON h.hacker_id = full_marks.hacker_id 
GROUP BY 
	h.hacker_id, h.name
HAVING 
	COUNT(*)>1

[최종 작성 쿼리]

SELECT 
    h.hacker_id,
    h.name
FROM Hackers AS h
	JOIN (SELECT 
    	s.hacker_id, 
    	s.challenge_id
	FROM 
    	Submissions AS s
    	JOIN Challenges AS c ON s.challenge_id = c.challenge_id
    	JOIN Difficulty AS d ON c.difficulty_level = d.difficulty_level
	GROUP BY 
    	s.hacker_id, s.challenge_id, d.score
	HAVING 
    	MAX(s.score) = d.score
 ) AS full_marks
ON h.hacker_id = full_marks.hacker_id 
GROUP BY 
	h.hacker_id, h.name
HAVING 
	COUNT(*)>1
ORDER BY COUNT(*) DESC, hacker_id ASC;

[한눈에 풀이 보기 정리]

 

  • full_marks 서브쿼리: 해커가 만점을 받은 (hacker_id, challenge_id) 쌍만 추림
  • 바깥쪽 쿼리: GROUP BY h.hacker_id, h.name을 해서 해커별로 묶음
  • 그 결과 COUNT(*) = 해당 해커가 만점을 받은 문제 수
  • HAVING COUNT(*) > 1 → 두 문제 이상 만점 받은 해커만 필터
  • 마지막 ORDER BY COUNT(*) DESC, h.hacker_id ASC → 요구된 순서대로 정렬

 

 

'코딩 테스트 > 02. SQL' 카테고리의 다른 글

[Hacker Rank] SQL Intermediate 'Symmetric Pairs' (Medium)  (4) 2025.08.22
[Hacker Rank] SQL Intermediate 'Contest Leaderboard' (Medium)  (0) 2025.08.22
[Hacker Rank] SQL Intermediate 'The Report' (Medium)  (0) 2025.08.22
[Hacker Rank] SQL Intermediate 'Weather Observation Station 5'(Medium)  (0) 2025.08.22
[Hacker Rank] SQL Intermediate 'Placemants' (Medium)  (1) 2025.08.18
'코딩 테스트/02. SQL' 카테고리의 다른 글
  • [Hacker Rank] SQL Intermediate 'Symmetric Pairs' (Medium)
  • [Hacker Rank] SQL Intermediate 'Contest Leaderboard' (Medium)
  • [Hacker Rank] SQL Intermediate 'The Report' (Medium)
  • [Hacker Rank] SQL Intermediate 'Weather Observation Station 5'(Medium)
Growth DA Log
Growth DA Log
Growth DA Log 님의 블로그 입니다.
  • Growth DA Log
    Growth DA Log님의 블로그
    Growth DA Log
  • 전체
    오늘
    어제
    • 분류 전체보기 (125)
      • TIS_COMPANY (6)
      • 코딩 테스트 (61)
        • 01. Python (3)
        • 02. SQL (58)
      • 데이터 분석 (53)
        • 01. BigQuery (9)
        • 02. GA4 (1)
        • 02-1. GA4를 더 잘 다루기 위한 마케팅 개.. (5)
        • 03. streamlit (5)
        • 04. Git (12)
        • 05. 데이터 엔지니어링 (3)
        • 06. 데이터 모델링 (11)
        • 07. Excel (0)
        • 08. Tableau (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    AARRR
    streamlit
    tableaubootcamp
    DENSE_RANK
    코딩테스트
    Reset
    tableau
    git
    ROW_NUMBER
    프로그래머스
    SQL
    cross_join
    revert
    코테
    rank
    코드잇스프린트후기
    solvesql
    이행성
    쿼리테스트
    윈도우함수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Growth DA Log
[Hacker Rank] SQL Intermediate 'Top Competitors' (Medium)
상단으로

티스토리툴바