Algorithms 🚀/HackerRank

[MySQL/해커랭크] Weather Observation Station 20

728x90

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

이 문제는 위도의 중간값을 구하는 문제입니다.

 

Oracle에서는 median이라는 함수를 사용해서 쉽게 구할 수 있지만 MySQL에서는 지원을 하지 않기 때문에 직접 구해야 합니다..ㅠ

 

중간값이란 데이터를 정렬했을 때 가운데 순번에 있는 숫자를 말합니다. (이때, 정렬 기준은 오름차순이던 내림차순이던 상관없습니다)

set @rownum = -1;
select round(avg(lat_n), 4) as median
from (select @rownum := @rownum +1 as rownum, lat_n
      from station 
      order by lat_n) as s
where s.rownum in (floor(@rownum / 2), ceil(@rownum / 2));     

저는 rownum이라는 변수를 만들어서 테이블 행을 세주는 방법을 사용했습니다.

 

변수를 -1로 초기화 한 이유는 데이터의 개수가 홀수/짝수에 따라 중간값을 구하는  방법이 다르기 때문입니다.

 

set @rownum = -1
select @rownum := @rownum +1 as rownum, lat_n
from station 
order by lat_n

lat_n을 기준으로 오름차순 정렬을 해서 출력하면 아래와 같은 결과가 나옵니다.

 

 

 

조건에 맞는 숫자들을 가지고 평균값을 출력합니다!

 

여기서 s.rownum은 0~마지막 인덱스, @rownum은 마지막 인덱스 값으로 고정입니다.

 

홀수인 경우(rownum은 짝수)에는 floor던지 ceil이던지 똑같은 값이 나오기 때문에 한 가지 값으로 결과값을 조회하고,

 

짝수인 경우(rownum은 홀수)에는 조건을 만족하는 2개의 값을 가지고 평균을 구해서 결과값을 조회하게 됩니다.

set @rownum = -1;
select round(avg(lat_n), 4) as median
from (select @rownum := @rownum +1 as rownum, lat_n
      from station 
      order by lat_n) as s
where s.rownum in (floor(@rownum / 2), ceil(@rownum / 2));     

 

 

 

 

 

 

728x90

'Algorithms 🚀 > HackerRank' 카테고리의 다른 글

[해커랭크/SQL] Top Competitors  (0) 2021.05.09
[해커랭크/SQL] New Companies  (0) 2021.05.09
[MySQL/해커랭크] The Report  (0) 2021.05.03
[MySQL/해커링크] Placements  (0) 2021.04.25
[MySQL/해커랭크] Symmetric Pairs  (0) 2021.04.25