본문 바로가기
Database

[Oracle/HackerRank]Weather Observation Station 5(풀이 성공)

by 전봇대파괴자 2021. 3. 26.

문제

각국의 도시에 대한 데이터를 담은 STATION 스키마가 있다. STATION의 각 칼럼별 정보는 다음과 같다. 

CITY에서 가장 짧은 이름을 가진 데이터가장 긴 이름을 가진 데이터에 접근하라. 만약 조건에 해당하는 데이터가 하나 이상일 경우, 알파벳 순으로 가장 먼저 위치한 데이터를 선택한다.  

 

Sample Input :

For example, CITY has four entries: DEF, ABC, PQRS and WXY.

Sample Output :

ABC 3
PQRS 4

 

내 코드:

SELECT CITY, LENGTH(CITY)
FROM (SELECT CITY, LENGTH(CITY)
      FROM STATION 
      WHERE LENGTH(CITY)=(SELECT MIN(LENGTH(CITY)) AS ANSWER 
                          FROM STATION) ORDER BY CITY)
                          WHERE ROWNUM=1;
                          
SELECT CITY, LENGTH(CITY)
FROM (SELECT CITY, LENGTH(CITY)
      FROM STATION 
      WHERE LENGTH(CITY)=(SELECT MAX(LENGTH(CITY)) AS ANSWER 
                          FROM STATION) ORDER BY CITY)
                          WHERE ROWNUM=1;


 

다른 풀이:

SELECT CITY, LENGTH(CITY)
FROM (SELECT CITY, LENGTH(CITY) 
      FROM STATION 
      ORDER BY LENGTH(CITY), CITY)
WHERE ROWNUM = 1;

SELECT CITY, LENGTH(CITY)
FROM (SELECT CITY, LENGTH(CITY)
     FROM STATION
     ORDER BY LENGTH(CITY) DESC, CITY)
WHERE ROWNUM = 1;

 

Comment: 핵심은 결과값을 오름차순으로 ORDER BY한 후 가장 첫번째 값을 꺼내는 것입니다. ORDER BY의 실행 순서는 가장 마지막이기 때문에 괄호 바깥에 위치할 경우, 아직 정렬되지 않은 상태의 결과 중 첫 번째 값이 나오게 됩니다. 이런 상황을 피하기 위해서는 ORDER BY를 FROM 안에 따로 담아 처리해준 후 다시 WHERE로 첫 번째 값을 꺼내야 합니다.    

 

두 번째 풀이도 원리는 비슷하지만 조금 더 간단해졌습니다. ORDER BY 하나로도 정렬은 가능합니다....그걸 전 몰랐었네요. 우선 LENGTH(CITY) 기준으로 한번 정렬해준 후, 그 다음에 CITY로 기준을 주어 알파벳 순으로 다시 정렬합니다. 저는 이 두 조건이 한 번에 적용되지 못할 거라고 생각해서 고민을 했는데 기우였네요.