문제 참조 : https://www.hackerrank.com/challenges/full-score/problem
풀이 매크로
1. 문제 정의 : 두개이상의 챌린지에서 만점(full score) 받은 해커들의 이름과 hacker_id를 구해라
- 만점의 정의는 무엇인가?
2. 요구조건 :
- 풀 스코어기준으로 내림차순으로 정렬 후 2개이상 해커들은 오름차순으로 정렬해라
3. 문제 정의에 의한 탐색작업
- 테이블들을 엮어서 풀스코어를 나름대로 정의해봄
- 정의한 풀스코어로 손으로 계산하고 대조해본 다음 요구조건까지 고려하고 예시 output 결과와 같은지 비교
- output과 같다면, SQL을 어떻게 작성할지 그다음 고민한다.
코드 작성
SELECT S.hacker_id, H.name
FROM Submissions AS S
LEFT JOIN Challenges AS C ON S.challenge_id = C.challenge_id
LEFT JOIN Difficulty AS D ON C.difficulty_level = D.difficulty_level
LEFT JOIN Hackers AS 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) >= 2
ORDER BY COUNT(S.challenge_id) DESC, hacker_id
배운 내용
1. LEFT JOIN 대신 INNER JOIN을 사용해도 됨. 단 이 문제의 경우 JOIN 하는 양쪽 테이블의 정보가 모두 있다는 가정하에 가능하다.
2. GROUP BY에 들어가는 변수를 HAVING 절에 못넣음
3. 문제가 복잡할때 문제에서 정의를 내려야 할 것이 무엇인지 고민하고 예시에 접목해봐야 한다.
'SQL > 코딩테스트' 카테고리의 다른 글
[MySQL] SUB쿼리를 굳이 쓰지 않아도 되는 경우 (0) | 2024.11.10 |
---|---|
[MySQL] 하나의 테이블에 두개의 키 변수를 이용해 Join 하기 (0) | 2024.11.09 |
[MySQL] TRUNCATE와 WHERE 조건 범위 (0) | 2024.11.08 |
[MySQL] SUBSTR/REGEXP/LEFT/RIGHT 문자열 다루기 (1) | 2024.11.08 |
[MySQL] INNER JOIN과 LEFT JOIN 쓰임 / COUNT(DISTINCT) (0) | 2024.11.07 |