SQL 데이터 분석

[코딩테스트] 해커랭크 Hackerrank SQL Top Competitors 문제풀이

deviz 2024. 10. 24. 16:42
반응형

SQL 코딩테스트 준비를 위해 해커랭크 문제풀이를 해보려고 합니다. 서버는 MySQL을 기준으로 설정하였으며, 문제의 핵심은 sql에서 어떤 join을 사용할 것인지, having, order by 조건을 정확히 사용할 수 있는지를 이해하는 것입니다. SQL 코딩 능력을 키우고자 하는 분들에게 도움이 될 수 있도록 문제 해결에 필요한 사고 과정과 코드 설명을 상세히 다루었습니다. 

 

 

퐈이어 🔥

 

문제 : Top Competitors (hackerrank sql, mysql) 

 

난이도 : Medium

서버 : MySQL

테이블 이름 : 총 5개,
(1) Hackers
(2) Difficulty 
(3) Challenges
(4) Submissions

 

- 문제 의도 : JOIN 무엇을 사용할 것인지, HAVING, ORDER BY 조건을 정확히 사용할 수 있는지 

 

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

 

Top Competitors | HackerRank

Query a list of top-scoring hackers.

www.hackerrank.com

 

문제 요약 :

추출 : hacker id, name
추출 조건 : 2번 이상 챌린지한  hacker name만, difficulty 테이블에 있는 10단위의 score만 
정렬 조건 : 챌린지 횟수 구해서 내림차순,  hacker_id 오름차순

 

 

input sample

 

Hackers table
Difficulty table

 

challenges table

 

Submissions table

 

output sample

 

 

정답 SQL 코드 :

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

 

 

 

풀이과정 : 

(나의 풀이 사고과정 정리- 회고록) 

 

 

 

일단 잘못 이해한 부분이 있었다. 



추출 : hacker id, name
추출 조건 : 2번 이상 챌린지한  hacker name만
                -> 여기서 Full score 조건도 있었는데, 예시 데이터에서 90411 Joe만 있어서 
                     이때, Joe의 score가 100점이라 
                     full score의 의미를 100점으로 잘못 이해했다. 
order 조건 : total number of challenge(챌린지 횟수) desc hacker_id asc

 

 

 

그래서, 다음과 같이 쿼리를 작성했었다. 

<Wrong answer query> 

SELECT s.hacker_id, 
h.name, 
COUNT(DISTINCT h.name) as total_number_of_challenges
FROM Submissions s 
JOIN Challenges c ON s.hacker_id = c.hacker_id
JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
JOIN Hakcers h ON s.hacker_id = h.hacker_id 
WHERE s.score = 100 
GROUP BY s.hacker_id, h.name
HAVING count(h.name) > 1 
ORDER BY total_number_of_chalenges desc, hacker_id asc

 

 

 

이후 나는 2가지를 수정했다. 

 

(1) full score의 의미는, Difficulty table의 score 10단위들을 말하는데, 
submissions score에는 35, 77 등 10단위 점수가 아닌 것도 있었다. 
WHERE s.score = d.score 


(2) 조건 중 HAVING절 수정, 더 정확히 challenge 1번 이상 조건으로 변경

HAVING count(h.name) > HAVING count(c.challenge_id) 


따라서, 다음과 같은 코드를 실행하면 정답!

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

 

[코딩테스트] Hackerrank SQL Weather Observation Station 18 해커랭크 문제

반응형