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으로 해결하였다.
'SQL' 카테고리의 다른 글
[프로그래머스] 년,월,성별별 상품 구매 회원 수 구하기 (Lv 4) (0) | 2024.01.12 |
---|---|
[SQLD] Grouping 함수, Window 함수 정리 (1) (1) | 2023.12.27 |
[SQL] 프로그래머스 입양시각 구하기 (2) (0) | 2021.09.21 |
[SQL] LeetCode - 181. Employees Earning More than their Manager (0) | 2021.09.02 |
[SQL] HackerRank - Contest Leaderboard (0) | 2021.09.01 |