코딩 테스트/MySQL

[HackerRank] Weather Observation Station 5

알밤바 2025. 7. 18. 11:22
728x90
반응형
 

Weather Observation Station 5 | HackerRank

Write a query to print the shortest and longest length city name along with the length of the city names.

www.hackerrank.com


문제

 

문제 접근 방식

city 문자열 길이가 가장 짧고, 가장 긴 city와 길이를 조회하는 문제이다.

여기서, 1개의 쿼리가 아닌 2개의 쿼리도 가능하다고 함. 그렇다면 매우 쉬워짐!

/* CITY 문자열 길이가 가장 짧은 CITY */
SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY), CITY LIMIT 1;

/* CITY 문자열 길이가 가장 긴 CITY */
SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY) DESC, CITY LIMIT 1;

 

- LENGTH(컬럼명) 활용하여 문자열 길이 구하기

- ORDER BY를 활용하여 문자열 길이와 알파벳 순서를 정렬

- LIMIT를 활용하여 가장 짧고, 긴 CITY만 추출

 

 

그렇다면 1개의 쿼리로는 추출할 수 없을까?

1개의 쿼리로 원하는 값을 조회해보았다.

WITH CITY AS (
	-- 1) CITY별 길이 계산
    SELECT CITY
         , LENGTH(CITY) AS LNG
    FROM STATION
), MINMAX AS (
	-- 2) 전체 길이 중 가장 짧고, 긴 문자열 길이 추출
    SELECT CITY, LNG
         , MIN(LNG) OVER() AS MIN
         , MAX(LNG) OVER() AS MAX
    FROM CITY
    GROUP BY CITY, LNG
), RN AS (
	-- 3) 알파벳 정렬하여 1개만 조회해야 하므로 ROW_NUMBER로 순서 설정
    SELECT CITY, LNG
         , ROW_NUMBER() OVER(PARTITION BY LNG ORDER BY CITY) AS RN
    FROM MINMAX
    WHERE LNG IN (MIN, MAX)
)
-- 4) 순서가 1인 ROW만 추출
SELECT CITY, LNG FROM RN WHERE RN = 1;

 

- LENGTH(컬럼명)을 활용하여 문자열 길이 구하기

- MIN() OVER() / MAX() OVER() 를 활용하여 전체 길이의 최소 최대값 구하기

- 길이가 최소, 최대값인 ROW 중 동일한 길이가 있을 수 있으므로 ROW_NUMBER()를 활용하여 알파벳 정렬 후 순서 매기기

- 순서가 1인 ROW만 추출

 

 

728x90
반응형