ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 해커랭크 Weather Observation Station 20 (중앙값, 윈도우 함수)
    Programing Language/SQL 2025. 6. 16. 09:29
    반응형

    https://www.hackerrank.com/challenges/weather-observation-station-20/problem

     

    Weather Observation Station 20 | HackerRank

    Query the median of Northern Latitudes in STATION and round to 4 decimal places.

    www.hackerrank.com


    문제 정의 (영어 -> 한국어 번역 후 문제 파악하기)

    중앙값  데이터 집합의 위쪽 절반과 아래쪽 절반을 구분하는 숫자로 정의됩니다. STATION 에서 북위도 ( LAT_N ) 의 중앙값을 쿼리 하고 답을 소수점 이하 자릿수에서 반올림하세요.

     

    문제 접근

    • 북위도 ( LAT_N ) 중앙값 구하기
    • 접근
      • 개념
        • 홀수 1개 : 1,2,3,4,5 => (5+1)/2 = 3 or (5+2)/2 = 3.5 => 3  
        • 짝수 2개 : 1,2,3,4 => (4+1)/2 = 2.5 => 2 or (4+2)/2 = 3
      • 단계별 cte
        • where을 이용해서 lat_n  = 중앙값
        • 데이터 행 갯수를 알 수 없으므로 "홀수 중앙값 위치" or "짝수 중앙값 위치"
        • lan_n 평균값 구하기
        • 소수점 4자리까지 반올림
    /*
    -- 북위도 ( LAT_N ) 중앙값 평균 구하기
    -- 접근
    	-- 개념
        	-- 홀수 중앙값 위치 1개 : 1,2,3,4,5 => (5+1)/2 = 3 or (5+2)/2 = 3.5
            -- 짝수 중앙값 위치 2개 : 1,3,3,4 = (4+1)/2 = 2.5 or (4+2)/2 = 3
        -- 단계별 cte
        	-- lat_n의 크기 순으로 index, 전체 cnt 생성
        	-- where을 이용해서 index 로 중앙값 위치의 lat_n 소환
            -- 데이터 행 갯수를 알 수 없으므로 "홀수 중앙값 1개 위치" or "짝수 중앙값 2개 위치"
            -- 짝수 경우를 대비해서 중앙값 평균 구하기
    */
    with lat_n_index as (
    	select lat_n
        	, row_number() over(order by lat_n asc) rn
            , count(*) over() total_cnt
    	from station
    )
    select round(avg(lat_n),4)
    from lat_n_index
    where (rn = (total_cnt+1)/2)
    	or (rn = (total_cnt+2)/2)
    ;

     


    📊 실제 예시로 확인해보기

    홀수 개수 (5개): [1, 3, 5, 7, 9]

     
    위치:  1  2  3  4  5
    값:   1  3  5  7  9
    • n/2 = 5/2 = 2.5 → 2 (2번째 위치 = 값 3) ❌
    • (n+1)/2 = 6/2 = 3 (3번째 위치 = 값 5) ✅ 정답!

    짝수 개수 (4개): [1, 3, 5, 7]

     
    위치:  1  2  3  4
    값:   1  3  5  7
    • n/2 = 4/2 = 2 (2번째 위치 = 값 3)
    • n/2+1 = 3 (3번째 위치 = 값 5)
    • 중앙값 = (3+5)/2 = 4

    🎯 왜 (n+1)/2, (n+2)/2 를 사용?

    공식의 이유:

    • (n+1)/2: 홀수일 때 정확한 중앙 위치
    • (n+2)/2: 짝수일 때 두 번째 중앙 위치

    🔍 n/2의 문제점

     
    sql
    -- 5개 데이터에서 n/2 = 2.5 → 2 (잘못된 위치)
    -- 실제 중앙값 위치는 3번째여야 함!

    💡 핵심 개념

    • 중앙값 위치전체 개수의 절반
    • 중앙값 위치 = 정렬된 데이터의 가운데 순서

    따라서 (n+1)/2, (n+2)/2가 수학적으로 정확한 공식

    🔍 SQL 정수 나눗셈의 비밀

    실제 SQL에서 계산:

     
    sql
    -- 짝수 4개일 때
    (4+1)/2 = 5/2 = 2.5 → 2 (정수 변환)  -- 2번째 위치
    (4+2)/2 = 6/2 = 3.0 → 3 (정수 변환)  -- 3번째 위치

    홀수 5개일 때

     
    sql
    (5+1)/2 = 6/2 = 3.0 → 3 (정수 변환)  -- 3번째 위치  
    (5+2)/2 = 7/2 = 3.5 → 3 (정수 변환)  -- 3번째 위치 (중복)

    💡 핵심: SQL은 정수 나눗셈!

    4개 데이터 [1,3,5,7]에서:

    • (4+1)/2 = 2.5 → 2 (2번째 = 값 3)
    • (4+2)/2 = 3.0 → 3 (3번째 = 값 5)
    • 결과: 2번째, 3번째 위치 선택 ✅
    • 평균: (3+5)/2 = 4 ✅

    5개 데이터 [1,3,5,7,9]에서:

    • (5+1)/2 = 3.0 → 3 (3번째 = 값 5)
    • (5+2)/2 = 3.5 → 3 (3번째 = 값 5, 중복)
    • 결과: 3번째 위치만 선택 ✅

     

     

    반응형

    댓글

Designed by Tistory.