본문 바로가기
프로그래밍 언어/SQL

[Hackkerrank] The PADS

by gokite 2022. 1. 25.

https://www.hackerrank.com/challenges/the-pads/problem?isFullScreen=true&h_r=next-challenge&h_v=zen 

 

The PADS | HackerRank

Query the name and abbreviated occupation for each person in OCCUPATIONS.

www.hackerrank.com

 

<문제>

해당 문제는 두 개의 결과물을 도출해야 한다.

 

1. 테이블에 있는 이름 이름(직업명) 형태로 출력해라. ex) Ashely(P)

조건 : 이름순으로 정렬해라 

 

2. 직업의 수를 There are a total of 수 직업명s 형태로 출력해라 ex) There are a total of 3 doctors.

조건 : 직업 수를 우선으로 정렬하고, 같은 수가 있을 시 직업명 알파벳순으로 정렬해라.

 

 

<풀이 과정>

 

어떻게 각기 다른 결과를 붙일 것인가?
Naomi(P)
Priya(D)
Priyanka(P)
Samantha(A)
There are a total of 3 doctors.
There are a total of 4 actors.
There are a total of 4 singers.

위와 같은 결과물을 한 번에 나타내야한다. 즉 UNION ALL을 사용할 수 밖에 없다.

같은 테이블을 이용해서 첫 번째 문제 값을 도출하고, 같은 테이블을 이용해서 두 번째를 도출해서 붙이는 방식으로 진행 해야한다.

여기서 고려해야할 점은, 상관없는 열의 UNION이라 하더라도 행의 개수는 동일해야한다는 점이다. 그래서 위의 결과는 따로 나눠서 출력하는 것이 아닌 CONCAT으로 문자열을 붙여 하나의 행으로 출력할 수 밖에 없다.

 

 

정렬이 먹히지 않는다??
(SELECT CONCAT(NAME, "(", SUBSTR(OCCUPATION,1,1), ")") 
FROM OCCUPATIONS
ORDER BY NAME)

UNION ALL

(SELECT CONCAT("There are a total of ", A.CNT," ", LOWER(A.OCCUPATION),"s"  )
 FROM (
    SELECT OCCUPATION, COUNT(1) AS CNT
    FROM OCCUPATIONS
    GROUP BY OCCUPATION) AS A
ORDER BY A.CNT ASC, A.OCCUPATION ASC)
Ketty(A)
Belvet(P)
Naomi(P)
Jane(S)
Jenny(S)
Kristeen(S)
Christeen(S)
Eve(A)
Aamina(D)
There are a total of 7 professors
There are a total of 4 actors
There are a total of 3 doctors
There are a total of 4 singers

얼추 정답이 나온 것 같지만, 두 번째 문제의 정렬이 제대로 먹히지 않았다.

따로 오류가 나지 않았는데, 결과값은 나오지 않아서 고민을 좀 했다.

 

(SELECT CONCAT(NAME, "(", SUBSTR(OCCUPATION,1,1), ")") 
FROM OCCUPATIONS
ORDER BY NAME)

UNION ALL

(SELECT CONCAT("There are a total of ", A.CNT, " ", LOWER(OCCUPATION), "s.") 
 FROM (
    SELECT OCCUPATION, COUNT(1) AS CNT
    FROM OCCUPATIONS
    GROUP BY OCCUPATION
    ORDER BY CNT, OCCUPATION) AS A
)

서브쿼리에 정렬을 넣어서 돌렸으나..

Ketty(A)
Belvet(P)
Naomi(P)
Jane(S)
Jenny(S)
Kristeen(S)
Christeen(S)
Eve(A)
Aamina(D)
There are a total of 3 doctors.
There are a total of 4 actors.
There are a total of 4 singers.
There are a total of 7 professors.

숫자는 정렬이 됐으나, 문자열은 정렬이 안됐다. 근데 돌리고 나서 생각난 것이 서브쿼리의 정렬은 먹히지 않는다고 본 거 같은데 왜...숫자가 정렬됐을까..? 이 부분은 아직 의문이다..그리고 단순히 UNION ALL의 정렬 문제라는 걸 깨닫고 아래와 같이 코드를 수정했다.

 

<정답 코드>

SELECT CONCAT(NAME, "(", SUBSTR(OCCUPATION,1,1), ")") 
FROM OCCUPATIONS
ORDER BY NAME;



SELECT CONCAT("There are a total of ", A.CNT, " ", LOWER(OCCUPATION), "s.") 
 FROM (
    SELECT OCCUPATION, COUNT(1) AS CNT
    FROM OCCUPATIONS
    GROUP BY OCCUPATION) AS A
ORDER BY A.CNT, A.OCCUPATION;

제대로 돌아간다. 저번에 따로 정리했던 부분이 생각나서 그렇게 고쳤더니 잘 돌아간다.

UNION ALL 을 사용하면 결국 한 테이블로 취급하기때문에, ORDER BY는 한 번밖에 쓰지 못한다. 

자세한 해결 방법을 알고 싶다면, 아래 링크를 클릭하면 된다.!

 

 

https://notmoonsong.tistory.com/29?category=932577 

 

[Hackerrank] Weather Observation Station 5

자세한 문항은 아래 링크에서 확인하실 수 있습니다. https://www.hackerrank.com/challenges/weather-observation-station-5/problem?isFullScreen=true&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&..

notmoonsong.tistory.com