๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

SQL

[SQL] SQL๋กœ ์ด์ง„ํŠธ๋ฆฌ ํƒ์ƒ‰ํ•˜๊ธฐ(HackerRank - Binary Tree Nodes ๋ฌธ์ œ)

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ๋ณธ ํฌ์ŠคํŒ…์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ž๋ฃŒ์™€ ์ถœ์ฒ˜๋Š” HackerRank ์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค. ๋” ๋‹ค์–‘ํ•œ SQL ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์‹œ๋ ค๋ฉดHackerRank ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•ด ๋ณด์„ธ์š”!

 

HackerRank ์‚ฌ์ดํŠธ

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” SQL๋กœ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ ค ํ•œ๋‹ค. ๋ฌธ์ œ ์›๋ณธ์€ ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•ด ํ™•์ธํ•˜์ž.

 

์šฐ์„ ์€ ์ด์ง„ํŠธ๋ฆฌ(Binary Tree)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. $Leaf$ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  $Root$ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋ถ€๋ชจ(Parent) ๋…ธ๋“œ๋Š” ์ž์‹ ์˜ ๋…ธ๋“œ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ ๋ฌด์กฐ๊ฑด ์ž‘์€ ๊ฐ’, ์˜ค๋ฅธ์ชฝ์€ ๋ฌด์กฐ๊ฑด ํฐ ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ๋ถ€๋ชจ ๋…ธ๋“œ์— ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ…์ŠคํŠธ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ์— ์ด์ง„ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์ง„์œผ๋กœ ๊ฐ€์ ธ์™€ ๋ณด์•˜๋‹ค.

 

์ด์ง„ํŠธ๋ฆฌ(์ถœ์ฒ˜ : Wikipedia)

 

์ด์ œ ์ด์ง„ํŠธ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋„ ์•Œ์•˜์œผ๋‹ˆ ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ์‚ฌํ•ญ์„ ์‚ดํŽด๋ณด์ž.

 

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 ๋‚œ์ด๋„ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ•ด์น˜์› ๋‹ค!๐Ÿ”ฅ

๋ฐ˜์‘ํ˜•