๐ ๋ณธ ํฌ์คํ ์์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์๋ฃ์ ์ถ์ฒ๋ HackerRank ์์ ๋ฐํ๋๋ค. ๋ ๋ค์ํ SQL ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ ค๋ฉดHackerRank ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํด ๋ณด์ธ์!
์ด๋ฒ ํฌ์คํ ์์๋ SQL๋ก ์ด์งํธ๋ฆฌ๋ฅผ ํ์ํ๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ค ํ๋ค. ๋ฌธ์ ์๋ณธ์ ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํด ํ์ธํ์.
์ฐ์ ์ ์ด์งํธ๋ฆฌ(Binary Tree)๋ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ ๊ฐ๊ณ ์๋ค. $Leaf$ ๋ ธ๋๋ฅผ ์ ์ธํ๊ณ $Root$ ๋ ธ๋๋ฅผ ํฌํจํ ๋ชจ๋ ๋ถ๋ชจ(Parent) ๋ ธ๋๋ ์์ ์ ๋ ธ๋๊ฐ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ ๋ฌด์กฐ๊ฑด ์์ ๊ฐ, ์ค๋ฅธ์ชฝ์ ๋ฌด์กฐ๊ฑด ํฐ ๊ฐ์ด ์กด์ฌํ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ผ๊ณ ํ ์ ์๋ค. ๋จ, ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋๊ฐ ํ๋๋ง ์กด์ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ํ ์คํธ๋ก ์ดํดํ๊ธฐ ์ฝ์ง ์์ ์๋ ์๊ธฐ์ ์ด์งํธ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ง์ผ๋ก ๊ฐ์ ธ์ ๋ณด์๋ค.
์ด์ ์ด์งํธ๋ฆฌ๊ฐ ๋ฌด์์ธ์ง๋ ์์์ผ๋ ๋ฌธ์ ์์ ์๊ตฌํ๋ ์ฌํญ์ ์ดํด๋ณด์.
Write a query to find the node type ofBinary Treeordered by the value of the node. Output one of the following for each node(๊ฐ ๋ ธ๋๊ฐ ์ด๋ค ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋์ง ๋ฌธ์์ด๋ก ๋ช ์ํ๊ณ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ ธ๋์ ๊ฐ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ํ์ฌ ์ ๋ ฌํด๋ผ. ์ด ๋ ๋ฃจํธ๋ ธ๋๋ผ๋ฉด $Root$๋ฅผ, ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ ธ๋๋ค์ด๋ผ๋ฉด $Leaf$๋ฅผ, $Root$๋ ธ๋๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ถ๋ชจ๋ ธ๋๋ค์ $Inner$๋ฅผ ์ถ๋ ฅํด๋ผ.)
ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ ์์ด๋์ด๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํน์ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ ๋ฐ๋ผ ๋ฌธ์์ด์ ์ถ๋ ฅํด์ฃผ์ด์ผ ํ๋ฏ๋ก CASE WHEN ๋๋ IF ๋ฌธ์ ์ฌ์ฉํ ์ ์์ ๊ฒ ์ด๋ค.
- ์ฐ์ ๋ฌธ์ ์๋ณธ์์ ์์ I/O์ผ๋ก ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ค๋ก ์ด์งํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ๊ทธ๋ ค๋ณด์.
- N์ ์์๋ ธ๋ P๋ ๋ถ๋ชจ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ์ด ๋๊ฐ๊ฐ ๋์ผํ๋๋ก ํ๋ฉด์ INNER JOIN์ ์์ผ๋ณด์.
์ฐ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ค์ N = P
๋ฅผ ๊ธฐ์ค์ผ๋ก INNER JOIN
์ ์ํค๋ฉด ๋ค์์ ํ
์ด๋ธ๊ณผ ๊ฐ์์ง๋ค.
$b_1$ | $b_2$ | ||
N(์์๋ ธ๋) | P(๋ถ๋ชจ๋ ธ๋) | N(์์๋ ธ๋) | P(๋ถ๋ชจ๋ ธ๋) |
1 | 2 | 2 | 5 |
3 | 2 | 2 | 5 |
6 | 8 | 8 | 5 |
9 | 8 | 8 | 5 |
2 | 5 | 5 | Null |
8 | 5 | 5 | Null |
์ ํ ์ด๋ธ์ ํ๋จ์ ์ด์งํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ํ ํ ์ด๋ธ์ด๋ค.
์ ๊ทธ๋ฆผ๊ณผ INNER JOIN
์ํจ ํ
์ด๋ธ์ ๋น๊ตํด๋ณด๋ฉด $b_2$ ํ
์ด๋ธ์ P๊ฐ์ด NULL์ผ ๋ $b_2$์ N๊ฐ์ ๋ณด๋ฉด $Root$๋
ธ๋์ธ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ $b_2$ ํ
์ด๋ธ์ P
๊ฐ์ด NULL
์ด ์๋ ๋ $b_2$์ N๊ฐ๋ค์ ๋ณด๋ฉด ๋ชจ๋ $Inner$๋
ธ๋์ธ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ ์ข
๋ฅ ๋
ธ๋์ ์ํ ๊ฐ๋ค์ ์ ์ธํ ๋๋จธ์ง ๊ฐ์ด ๋ค์ด์๋ ๋
ธ๋๋ค์ $Leaf$๋
ธ๋์์ ์๋์ผ๋ก ํ๋จํ ์ ์๋ค.
ํ์๋ ์กฐ๊ฑด๋ฌธ์ SELECT
์๋ธ์ฟผ๋ฆฌ๋ฌธ์ ๋ฃ์ผ๋ ค๊ณ ํด์ ๊ฐ์์ ์ผ๋ก ๋ณด๊ธฐ์ IF
๊ตฌ๋ฌธ๋ณด๋ค๋ CASE WHEN
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ๋ฐ๋ผ์ ์ ๋ต SQL ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT N,
CASE WHEN N IN (SELECT DISTINCT b2.N
FROM BST b1
INNER JOIN BST b2 ON b1.P = b2.N
WHERE b2.P IS NULL) THEN 'Root'
WHEN N IN (SELECT DISTINCT b2.N
FROM BST b1
INNER JOIN BST b2 ON b1.P = b2.N
WHERE b2.P IS NOT NULL) THEN 'Inner'
ELSE 'Leaf'
END
FROM BST
ORDER BY N
๋ง์ง๋ง์ ๋
ธ๋์ ์๋ ๊ฐ๋ค์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ๊ธฐ๋ก ํ์ผ๋ฏ๋ก N
์นผ๋ผ์ ๊ธฐ์ค์ผ๋ก ORDER BY
์์ผ์ฃผ์.
์ด๋ ๊ฒ ๋ง์ง๋ง ์ด์งํธ๋ฆฌ ํ์ ๋ฌธ์ ๊น์ง HackerRank์ Medium ๋์ด๋ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํด์น์ ๋ค!๐ฅ
'SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL] SQL๋ก ์์(Prime Number) ์ถ๋ ฅํ๊ธฐ(HackerRank - Print Prime Numbers ๋ฌธ์ ) (0) | 2021.03.11 |
---|---|
[SQL] HackerRank - Placements ๋ฌธ์ (0) | 2021.03.10 |
[SQL] HackerRank - SQL Project Planning ๋ฌธ์ (0) | 2021.03.04 |
[SQL] HackerRank - Contest Leaderboard ๋ฌธ์ (0) | 2021.03.02 |
[SQL] MySQL์์๋ ์๋๋ ํ์ด(HackerRank - The PADS ๋ฌธ์ ) (0) | 2021.02.28 |