[TIL] MySQL TIL Day 5
๐ก [HackerRank] Weather Observation Station 20
https://www.hackerrank.com/challenges/weather-observation-station-20/problem?isFullScreen=true
Solution
์ด ๋ฌธ์ ๋ ๋จ์ํ โmedian ํจ์๋ฅผ ์จ์ผ์ง!โ ๋ผ๋ ์๊ฐ์ผ๋ก ์ ๊ทผํ๋ค๊ฐ ํฐ์ผ๋๋ค. Oracle์์๋ MEDIAN ํจ์๋ฅผ ์ ๊ณตํ์ง๋ง mySQL์์๋ ์ด ํจ์๋ฅผ ์ ๊ณตํ์ง ์์ ์ง์ median์ ๊ตฌํด์ผ ํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๋ฅผ lat_n์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ, ๊ฐ ํ์ ํ ๋ฒํธ๋ฅผ ๋ํ๋ด๋ ์๋ก์ด ๋ณ์๋ฅผ ํ๋ ์์ฑํ๋ฉด ๋๋ค. ๊ทธ ํ Median์ ๊ตฌํ๋ ์์์ ์ด์ฉํด ์ ๋ต์ ์ฐพ๋๋ค.
SET
mySQL์์ SET์ ์๋ก์ด ๋ณ์๋ฅผ ํ ๋นํ ๋ ์ฐ๋ ๋ฌธ๋ฒ์ด๋ค. ์ฃผ์ด์ง ๋ฐ์ดํฐ์ ๋ณ์๋ง์ผ๋ก๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ, SET์ ์ด์ฉํด ํ์ํ ๋ณ์๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค. ์ด ๋ฌธ์ ๊ฐ์ ๊ฒฝ์ฐ๋ ํ ๋ฒํธ๋ฅผ ์์ฑํด์ผ ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
์์
SET @rownum = -1; % ์ธ๋ฏธ์ฝ๋ก ํ์
SELECT @rownum := rownum + 1 AS rnum
FROM station
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด rownum์ด 0๋ถํฐ ์์ํ์ฌ $0, 1, 2, 3, \dots$ ๊ณผ ๊ฐ์ด ์์ฑ๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก ํ ๋ฒํธ๋ฅผ 0๋ถํฐ ์ฐจ๋ก๋๋ก ์ง์ ํด์ค๋ค. ๋จ, ์ด๋ฒ ๋ฌธ์ ์์๋ lat_n์ ๋จผ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ํ ํ ๋ฒํธ๋ฅผ ๋ถ์ฌํด์ผ ํ๋ค. ํ์ด๋ ์๋ ์ฝ๋์ ์๋ค.
Code
๋งจ ์๋ WHERE ์ ์ด ๋ฐ๋ก median์ ์ฐพ๋ ์ฝ๋์ธ๋ฐ, ์ด ๋ median์ ํด๋นํ๋ ํ ๋ฒํธ๋ฅผ ์ฐพ๊ธฐ ์ํด์๋ @rownum
์ ์ด์ฉํ๋ค. @rownum := @rownum + 1
์์ ์ต์ข
์ ์ผ๋ก ๋ง์ง๋ง ํ์ ๋ฒํธ๊ฐ @rownum
์
ํ ๋น๋์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฌ์ฉํด์ค์ผ ํ๋ค.
SET @rownum = -1; % ์ธ๋ฏธ์ฝ๋ก ํ์
SELECT ROUND(AVG(lat_n), 4) AS median
FROM (SELECT @rownum := @rownum + 1 AS rnum, lat_n
FROM station
ORDER BY lat_n) AS stat
WHERE rnum IN (FLOOR(@rownum/2), CEIL(@rownum/2))
๋๊ธ๋จ๊ธฐ๊ธฐ