Weather Observation Station 20 | HackerRank
Query the median of Northern Latitudes in STATION and round to 4 decimal places.
www.hackerrank.com
문제

문제 접근 방식
LAT_N의 중앙값을 찾는 문제이다.
MySQL은 중앙값을 구할 수 있는 내장함수가 없기 때문에 직접 계산해야 한다.
1) 우선 집계하기 전에 필요한 데이터를 만든다.
- LAT_N을 오름차순으로 정렬하여 순서 매기기 → ROW_NUMBER 활용
- LAT_N이 전체 몇 개가 있는지 (몇 개의 행이 있는지) 확인 → COUNT() OVER() 활용
2) 중앙값은 전체 데이터의 갯수가 짝수인지 홀수인지에 따라 계산식이 다르다.
- 홀수 : (전체 데이터 갯수 + 1) / 2 순번에 해당하는 값
- 짝수 : (전체 데이터 갯수) / 2, (전체 데이터 갯수) / 2 + 1 순번에 해당하는 2개의 값의 평균 값
짝수와 홀수라는 조건을 사용하기 위해서는 나머지를 구하는 MOD() 함수를 활용하였다.
여기서 요점은 짝수/홀수일 때 저 순서에 해당하는 값들을 가져오는 것이 중요하다.
WHERE 절에는 CASE WHEN 구문 등을 활용할 수 없기 때문에 다른 방식으로 조건을 걸어야 한다.
WHERE 절 내 AND와 OR 를 잘 활용하여 짝수/홀수일 때 필요한 순번을 가져오면 된다.
3) 전체 데이터의 갯수가 홀수일 때는 1개의 값만 들고 올 것이고, 짝수일 때는 2개의 값을 들고 올 것이다.
1개의 평균값은 원래의 값과 동일하므로 AVG() 함수를 활용하여 평균값을 계산해준다.
4) 마지막으로 소수점 4번째 자리까지 표현하라고 했기에 ROUND() 함수 사용하기
SELECT ROUND(AVG(TB.LAT_N), 4) /* 3) 평균값, 소숫점 네번째자리까지 표현 */
FROM (
/* 1) 필요한 값 생성 */
SELECT LAT_N
, ROW_NUMBER() OVER(ORDER BY LAT_N) AS RN
, COUNT(*) OVER() AS CNT
FROM STATION
) TB
WHERE 1=1
/* 2) 홀수 / 짝수일 때 조건 */
AND (MOD(TB.CNT, 2) = 1 AND TB.RN = (TB.CNT+1)/2)
OR (MOD(TB.CNT, 2) = 0 AND TB.RN IN (TB.CNT/2, (TB.CNT/2)+1))
;
'코딩 테스트 > MySQL' 카테고리의 다른 글
| [HackerRank] Top Competitors (2) | 2025.07.28 |
|---|---|
| [HackerRank] The Report (0) | 2025.07.25 |
| [HackerRank] New Companies (0) | 2025.07.22 |
| [HackerRank] Binary Tree Nodes (0) | 2025.07.21 |
| [HackerRank] Weather Observation Station 5 (0) | 2025.07.18 |