본문 바로가기

코딩공부

[HackerRank] 문제풀이 - MySQL Median 찾기

패스트캠퍼스의 SQL강의를 다 듣고 난 후, 'HackerRank'라는 사이트에서 SQL 문제들을 풀기 시작했다.

HackerRank는 코딩을 시작한 사람들은 누구나 아는 유명한 사이트로 SQL, Python, Java, C언어 등 다양한 종류의 언어들을 학습할 수 있는 사이트다.

www.hackerrank.com/dashboard

 

Dashboard | HackerRank

Join over 7 million developers in solving code challenges on HackerRank, one of the best ways to prepare for programming interviews.

www.hackerrank.com

 

나는 HackerLank에서 SQL 문제들을 풀고 있다.

배웠던 문법들을 실제 어떻게 사용할지 배울 수 있는 좋은 문제들이다.

난이도가 Easy~Hard까지 있는데 이번에 난이도 Medium의 어려운 문제가 있었다.

한참을 헤매다가 해설 찾아보면서 문제를 풀었는데, 잊지 않도록 기록으로 남기려 한다.

 


문제

HackerRank - SQL - Weather Observation Station 20

 

LAT_N의 Median(중간값)을 소숫점 4자리까지 출력하라.

 

해결

1. 중간 열 확인을 위해 Rownumber 열 추가

 

  SET @ ROWINDEX = -1 ;

 

   SET 변수 입력 후 ;를 눌러 코드를 끝내야 한다.

 

  SELECT @ROWINDEX := @ROWINDEX +1 AS ROWNUMBER, LAT_N FROM STATION 

 

   @ROWINDEX는 행마다 +1씩 더해져 값이 출력된다.

    즉, -1부터 시작했기에, 첫번째 행 0, 두 번째 행 1, 세 번째 행 2, 네 번째 행 3.....

 

2. Rownumber 이용하여 중간 열 확인

 

  WHERE ROWNUMBER IN (FLOOR(@ROWINDEX/2), CEIL(@ROWINDEX/2))

 

   (1) ROWNUMBER 값 중 IN에 있는 숫자와 일치하는 값만 필터됨

 

   (2) 여기서 @ROWINDEX는 행의 가장 마지막 값이 출력된다.

       즉, 100행이 있으면 @ROWINDEX에서는 99가 출력된다. (0부터 시작했기에)

 

   (3) FLOOR : 소수점 버림 / CEIL : 소수점 무조건 올림 

      @ROWINDEX가 99(홀수) 일 경우, @ROWINDEX/2는 49.5이고, 49행과 50행 두 개가 조회됨

      @ROWINDEX가 100(짝수) 일 경우, @ROWINDEX/2는 50이고, 50행만 조회됨.

 

3. 확인한 중간 열의 LAT_N 값을 확인

 

  SELECT ROUND( AVG (LAT_N), 4)

 

   (1) ROUND : 소수점 4자리까지 출력하기 위해

 

   (2) AVG : @ROWINDEX가 99(홀수) 일 경우, 2개 행의 평균값을 구해야 하기에

 

4. 각 단계의 코드를 합친 최종 코드

 


Oracle에는 Median 함수가 있어서 바로 구할 수 있다고 한다.

나는 MySQL을 기준으로 풀고 있어서 복잡하게 풀어야만 했다. 

행 개수를 구하는 것도 Oracle에는 Rank, Row_number가 있어서 함수 하나만 쓰면 바로 나오는데, MySQL에서는 SET을 이용해 복잡하게 구해야 했다.

(MySQL에서 이제는 Rank가 사용 가능해졌다고 들었으나, HackerRank에서는 이 부분이 반영이 안 되었는지 MySQL 선택 시 함수 사용이 불가능하다.)

그러나 복잡한 코드를 공부하면서 새로운 함수도 배우고, 문제 푸는 방식도 배웠으니 좋게 생각해야겠다.

이 문제를 풀기 위해 찾아봤던 '문제풀이 글' 링크도 첨부한다.

상세하게 설명되어 있어서 코드 하나하나 쫓아가며 따라 하기 쉬웠다.

글로만 보면 어려울 수 있으니, 실제로 코드를 작성하며 읽기를 추천한다. 

 

 techblog-history-younghunjo1.tistory.com/160

 

[SQL] MySQL로 중앙값(Median) 찾아내기 - (HackerRank - Weather Observation Station 20 문제)

🔊 본 포스팅에서 사용되는 테이블의 자료와 출처는 HackerRank 임을 밝힙니다. 더 다양한 SQL 문제를 풀어보시려면HackerRank 사이트를 방문해 보세요! 이번 포스팅에서는 MySQL을 활용해 Median값을 출

techblog-history-younghunjo1.tistory.com