본문 바로가기
MYSQL/HakerRank_Hard

15 Days of Learning SQL

by 수스리 2025. 4. 25.

https://chloe-chitchat.tistory.com/97

 

[HackerRank] 15 Days of Learning SQL (Hard)

못 풀어서 다른사람 답안 보고 공부했다 FROM절이 거의 쓸모가 없고 네개의 각 컬럼을 다 따로 구하는 접근이 인상깊었다 해커랭크가 그렇게 어려운 플랫폼이 아닌데 이 문제만 갑자기 급발진이

chloe-chitchat.tistory.com

너무 어려워서 위 블로그를 참조했다. 똑같은 쿼리라 쓰기도 민망하다. 내일 이 문제 다시 복습하고, Medium 문제 빠르게 다시 한번 더 풀어봐야겠다.

 

우선 정답 쿼리부터 보자

SELECT S1.submission_date,
        (
            SELECT COUNT(DISTINCT s2.hacker_id)
            FROM Submissions S2
            WHERE S2.submission_date = s1.submission_date
            AND (
                SELECT COUNT(DISTINCT S3.submission_date)
                FROM submissions s3
                WHERE s3.hacker_id = s2.hacker_id
                AND s3.submission_date < s1.submission_date) = DATEDIFF(s1.submission_date, '2016-03-01')
        ),
        (
            SELECT s2.hacker_id
            FROM Submissions s2
            WHERE s2.submission_date = s1.submission_date
            GROUP BY hacker_id
            ORDER BY COUNT(submission_id) DESC, hacker_id
            LIMIT 1 
        )AS what,
        (SELECT name FROM hackers WHERE hacker_id = what)

FROM (SELECT DISTINCT submission_date FROM Submissions) AS S1
GROUP BY 1

 

  • ELECT COUNT(DISTINCT s2.hacker_id)
    FROM Submissions S2
    WHERE S2.submission_date = s1.submission_date
    AND (내부 서브쿼리)
    • 현재 날짜(s1.submission_date)에 제출한 해커들 중에서 내부 서브쿼리의 조건을 만족하는 해커들의 수를 카운트합니다.
  • 내부 서브쿼리:
     
    sql
    SELECT COUNT(DISTINCT S3.submission_date)
    FROM submissions s3
    WHERE s3.hacker_id = s2.hacker_id
    AND s3.submission_date < s1.submission_date
    • 이 서브쿼리는 특정 해커(s2.hacker_id)가 현재 날짜(s1.submission_date) 이전에 제출한 고유한 날짜 수를 계산합니다.
  • 핵심 조건:
     
    sql
    (내부 서브쿼리) = DATEDIFF(s1.submission_date, '2016-03-01')
    • DATEDIFF 함수는 현재 날짜(s1.submission_date)와 시작일(2016-03-01) 사이의 일수를 계산합니다.
    • 예: 3월 5일이라면 DATEDIFF는 4입니다(3월 1일, 2일, 3일, 4일 - 총 4일).
    • 내부 서브쿼리 결과가 이 DATEDIFF와 정확히 일치해야 합니다.

<2025년 5월 8일 복습>

 

SELECT s1.submission_date,
(
    SELECT COUNT(DISTINCT s2.hacker_id)
    FROM submissions s2
    WHERE s2.submission_date = s1.submission_date
    AND (
        SELECT COUNT(DISTINCT s3.submission_date)
        FROM submissions s3
        WHERE s3.hacker_id = s2.hacker_id
        AND s3.submission_date < s1.submission_date
        ) = DATEDIFF(s1.submission_date, '2016-03-01')
),
(
    SELECT s2.hacker_id
    FROM submissions s2
    WHERE s2.submission_date = s1.submission_date
    GROUP BY hacker_id
    ORDER BY COUNT(submission_id) DESC, hacker_id
    LIMIT 1
) AS what,
(
    SELECT name FROM hackers WHERE hacker_id = what
)
FROM (SELECT DISTINCT submission_date FROM submissions )s1
GROUP BY 1

중요한건 두번째 컬럼

1. 날짜만 있는 s1과 인적정보가 있는 s2를 s1 날짜 s2 날짜 기준으로 조인한다.

2. s2와 s3를 셀프조인 한다.

3.[중요] s1보다 과거인 s3 역대 제출일 개수 = 첫날부터 s1까지의 일수 차이 조건에 해당하는 해커를 찾으면 매일매일 한 사람 찾기가 가능하다. 

4. s1날짜 = s2날짜로 되어있으니, s2의 해커id  수를 센다.

 

'MYSQL > HakerRank_Hard' 카테고리의 다른 글

Interviews  (0) 2025.04.23