이번 문제는 이진 트리와 관련된 문제를 푸는 쿼리입니다.
문제)
You are given a table, BST, containing two columns: N and P, where N represents the value of a node in Binary Tree, and P is the parent of N.
Write a query to find the node type of Binary Tree ordered by the value of the node. Output one of the following for each node:
* Root: If node is root node.
* Leaf: If node is leaf node.
* Inner: If node is neither root nor leaf node.
BST라는 테이블이 있고 N과 P 두 개의 컬럼을 포함하고 있습니다. P는 N 컬럼의 상위(부모)의 속성을 가지는 컬럼을 의미합니다.
위의 예시 그림과 같이 숫자 5는 Root라는 속성을 가지고 있고 1, 3, 6, 9는 Leaf라는 속성을 가지게 됩니다. 중간에 있는 속성들은 Inner라는 속성을 가지게 됩니다.
예시 테이블을 통해서 CASE 구문을 활용해서 문제를 풀어보면 될 것 같습니다.
첫 번째로는 p 컬럼에 null 값을 가지고 있으면 Root 속성을 부여하면 됩니다.
select n
, case
when p is null then "Root"
end
from bst
order by 1
두 번째로는 p 컬럼에 같은 값이 2개가 있다면 Inner 속성을 가지게 됩니다. 예시에서는 숫자 5도 p 컬럼에 2개 이상 포함되어 있지만 첫 번째 조건에서 이미 Root 속성을 부여하였기 때문에 숫자 5에 대해서는 적용되지 않습니다.
select n
, case
when p is null then "Root"
when n in (select p from bst group by p having count(*) >= 2) then "Inner"
else "Leaf"
end
from bst
order by 1
두 번째 When 구문에서 GROUP BY 및 HAVING을 활용하여 "Inner" 값을 부여해줍니다. 그리고 이외의 값은 else를 통해 "Leaf" 값을 부여해주면 됩니다.
처음에는 셀프 조인을 활용하여 문제를 풀어보려고 했으나 이진 트리가 길어지면 셀프 조인을 하는데 끝이 없었고 위와 같은 방식으로 풀면 어떠한 예시에서도 문제를 풀 수 있었습니다.
'SQL 스터디 > HackerRank' 카테고리의 다른 글
[해커랭크] MySQL PERCENT_RANK - Weather Observation Station 20 (0) | 2023.09.14 |
---|---|
[해커랭크] MySQL JOIN - New Companies (0) | 2023.09.12 |
[해커랭크] MySQL TRNCATE 함수 - Weather Observation Station 14 (0) | 2023.09.11 |
[해커랭크] MySQL 숫자를 문자로 변환하기(CAST) - The Blunder (0) | 2023.09.11 |
[해커랭크] MySQL concat 구문 - The PADS (0) | 2023.09.11 |