-
해커랭크 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번째 위치만 선택 ✅
반응형'Programing Language > SQL' 카테고리의 다른 글
해커랭크 Ollivander's Inventory (복합 조건 JOIN) (0) 2025.06.16 해커랭크 Binary Tree Nodes (CASE, 서브쿼리) (0) 2025.06.16 해커랭크 Placements (JOIN, 서브쿼리) (1) 2025.06.15 해커랭크 Top Competitors (다중 JOIN, 필터링) (0) 2025.06.15 해커랭크 The Report (JOIN, CASE문, NULL 처리) (1) 2025.06.15