본문 바로가기
SQL

[SQL] 해커랭크 Occupations 풀이

by 다람이도토리 2021. 9. 22.

HackerRank Occupation 풀이

문제 링크
https://www.hackerrank.com/challenges/occupations/problem

4개의 직업이 존재하는데 각 열별로 특정 직업을 가진 사람의 이름을 사전 순으로 나열한다.

단, 이렇게 하면 빈 칸이 생길 것인데 빈칸은 모두 Null로 채워야 하는 것이 문제이다.

 

풀이 방법

이를 위해서는 일단은 직업에 따라 사람들을 분류하는 것이 우선이다.

그리고, NULL을 띄우기 위한 발상은 다음과 같다.

아무튼, 1번째 의사/가수/교수/배우   2번째 의사/가수/교수/배우 ... 이렇게 나열을 해야 한다.
이를  위해서는 N번째 기준으로 group by를 해야 할 것이고 각 직업별로 N번째를 세야 한다.

다시 말해, 직업별 counter를 변수로 만들면 그만이다.!

풀이 코드 및 주의사항

SET  @D := -1, @P := -1, @S := -1, @A := -1; 
SELECT Min(sub.D), Min(sub.P), Min(sub.S), Min(sub.A)
FROM(
    SELECT
        CASE WHEN OCCUPATION = 'Doctor' THEN NAME ELSE NULL END AS D,
        CASE WHEN OCCUPATION = 'Professor' THEN NAME ELSE NULL END AS P,
        CASE WHEN OCCUPATION = 'Singer' THEN NAME ELSE NULL END AS S,
        CASE WHEN OCCUPATION = 'Actor' THEN NAME ELSE NULL END AS A,
        CASE
            WHEN OCCUPATION = 'Doctor' THEN @D := @D+1
            WHEN OCCUPATION = 'Professor' THEN @P := @P+1
            WHEN OCCUPATION = 'Singer' THEN @S := @S+1
            WHEN OCCUPATION = 'Actor' THEN @A := @A+1
            END AS counts
    FROM OCCUPATIONS
    ORDER BY NAME
) AS sub
GROUP BY sub.counts
ORDER BY sub.counts ASC

sub.counts로 groupby를 해서 그냥 D, P, S, A의 이름이 추출되지는 않는다. 다시 말해, 묶어주는 연산이 필요하고 이는 min으로 해결하였다.