문제링크: www.hackerrank.com/challenges/full-score/problem?isFullScreen=true
Table 설명
* Hackers: 전체 hackers 정보
* Difficulty: 문제의 난이도 별 Full score 정보
* Challenges: 문제와, 문제를 제작한 Hacker 정보, 문제의 난이도 정보
* Submissions: 문제를 제출한 사람의 정보와, 제출 시 score 정보
문제 설명
코딩테스트 제출자 중 full score 맞은 문제가 한개보다 많은 (2개 이상) 인 참가자의 hacker_id와, name을 뽑아라!
문제 풀이
1. submissions table을 base로 필요한 정보를 담고 있는 테이블들을 join
1) 제출한 문제의 full score 를 알기 위해 difficuly 테이블의 score 정보가 필요하다.
2) difficulty level 정보가 있어야 full score 를 연결할 수 있고, 그 정보는 Challenges 테이블에 있다.
3) hacker의 이름을 출력하기 위해 Hackers 테이블이 필요하다
JOIN 순서
FROM Submissions s
INNER JOIN Challenges c ON s.challenge_id = c.challenge_id
INNER JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
INNER JOIN Hackers h ON s.hacker_id = h.hacker_id
2. full score 인 컬럼만 뽑기
- difficulty 테이블이 fullscore 정보를 가지고 있는데, 제출한 score가 동일하다면 Full score 임
WHERE d.score = s.score
3. hacker_id 별 full score 맞은 문제 갯수 count 하고, 2개 이상 푼 사람만 추출
- group by로 hacker_id, name 으로 묶어준 뒤, count(challenge_id) > 1 인 컬럼만 뽑아준다.
SELECT s.hacker_id, h.name
FROM Submissions s
INNER JOIN Challenges c ON s.challenge_id = c.challenge_id
INNER JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
INNER JOIN Hackers h ON s.hacker_id = h.hacker_id
WHERE d.score = s.score
GROUP BY s.hacker_id, h.name
HAVING count(s.challenge_id) > 1
4. 정렬
ORDER BY count(s.challenge_id) DESC, s.hacker_id
5. 최종코드
SELECT s.hacker_id, h.name
FROM Submissions s
INNER JOIN Challenges c ON s.challenge_id = c.challenge_id
INNER JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
INNER JOIN Hackers h ON s.hacker_id = h.hacker_id
WHERE d.score = s.score
GROUP BY s.hacker_id, h.name
HAVING count(s.challenge_id) > 1
ORDER BY count(s.challenge_id) DESC, s.hacker_id
'Today I Learned > SQL 문제풀이' 카테고리의 다른 글
leetcode 1907. Count Salary Categories (열 -> 행으로 변환) (0) | 2023.12.29 |
---|---|
leetcode 1280. Students and Examinations (cross join) (1) | 2023.12.22 |
[leetcode] Department Highest Salary (윈도우함수) (0) | 2020.11.21 |
[hackerrank] Symmetric Pairs (0) | 2020.11.05 |