코딩 테스트/MySQL

[HackerRank] Weather Observation Station 20

알밤바 2025. 7. 24. 15:15
728x90
반응형
 

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))
;

 

728x90
반응형

'코딩 테스트 > 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