๐ ๋ณธ ํฌ์คํ ์์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์๋ฃ์ ์ถ์ฒ๋ HackerRank ์์ ๋ฐํ๋๋ค. ๋ ๋ค์ํ SQL ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ ค๋ฉด HackerRank ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํด ๋ณด์ธ์!
์ด๋ฒ ํฌ์คํ ์์๋ ์ฌ๋ฌ๊ฐ์ง ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ผ ํด๊ฒฐํ ์ ์๋ HackerRank์ Challenges ๋ฌธ์ ๋ฅผ ๊ฐ์ด ํ์ด๋ณด๋ ค๊ณ ํ๋ค. ์ฐ์ ๋ฌธ์ ์ค๋ช ๊ณผ ์ถ๋ ฅ ํํ๋ฅผ ์ดํด๋ณด์. ๋ฌธ์ ์๋ณธ์ ์ดํด๋ณด๋ ค๋ฉด ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํด๋ณด์. ๋ฌธ์ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
Julia asked her students to create some coding challenges. Write a query to print the hacker_id, name, and the total number of challenges created by each student. Sort your results by the total number of challenges in descending order. If more than one student created the same number of challenges, then sort the result by hacker_id. If more than one student created the same number of challenges and the count is less than the maximum number of challenges created, then exclude those students from the result.
(์ค๋ฆฌ์๋ ํ์๋ค์๊ฒ ์ฝ๋ฉ ๋ฌธ์ (challenges)๋ฅผ ๋ง๋ค์ด๋ฌ๋ผ๊ณ ์์ฒญํ๋ค. ์ด ๋ ๊ฐ ํ์์ hacker_id, name, ๋ฌธ์ ๋ฅผ ๋ง๋ ์ด ๊ฐ์๋ฅผ ์ถ๋ ฅ์์ผ๋ผ. ์ด ๋ ์ ๋ ฌ์ ์ด ๋ฌธ์ ๊ฐ์์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ํ๋ค. ๋ง์ฝ ๋๊ฐ์ ๋ฌธ์ ๊ฐ์๋ฅผ ๋ง๋ ํ์์ด 2๋ช ์ด์์ด๋ผ๋ฉด, ๊ทธ ๋๋ hacker_id ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์์ผ๋ผ. ๋ํ ๋ง์ฝ 2๋ช ์ด์์ด ๋๊ฐ์ ๋ฌธ์ ๊ฐ์๋ฅผ ๋ง๋ค์์ ๋, ๊ทธ ๋ฌธ์ ๊ฐ์๊ฐ ๋ฌธ์ ๊ฐ์์ ์ต๋๊ฐ๋ณด๋ค ์๋ค๋ฉด ๊ทธ ๋์ ํ์๋ค์ ์ถ๋ ฅ์ํค์ง ์์์ผ ํ๋ค.)
์ ๋ฌธ์ ์ฌํญ๋ง ์ฝ๋ค๋ณด๋ฉด ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ๊ฐ์ง ์์ ์ ์๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ์๋ณธ์ ์ดํด๋ณด๋ฉด์ Input / Output ์์๋ฅผ ๋ณด๋ฉด์ ๊ผญ ์ดํดํ๊ณ ์ด ํฌ์คํ ์ ์ฝ์ด๋ณด์. ๋ฌธ์ ์์ ์ฌ์ฉ๋ ์์ Output ํํ๋ฅผ ์ดํด๋ณด์. 2๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
๊ทธ๋ฆผ ์ 2 ๊ฐ์ง ์์์ ์ฐจ์ด์ ์ ์์ด ์ค๋ช
์๋ ์จ์๋ค ์ํผ challenges_created
๊ฐ์ด ๋์ผํ ๋ฐ์ดํฐ๊ฐ 2๊ฐ ์ด์์ผ ๋ ๊ทธ ๊ฐ์ด challenges_created
์ ์ต๋๊ฐ๋ณด๋ค ์๋ค๋ฉด ์ฟผ๋ฆฌํ์ง ์๊ณ ๋์ผํ๋ค๋ฉด ์ฟผ๋ฆฌ์ํค๋ฉด ๋๋ค.
์ด์ ์ ๋ฌธ์ ๋ฅผ ํ์ดํ๊ธฐ ์ํ ์ฌ๊ณ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ๋์ด์์ผ๋ณด์.
1. ์ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๋ ๊ฐ์ ์ฆ, challenges_created
๊ฐ์ด 2๊ฐ ์ด์ ์ค๋ณต๋์ง ์๊ณ 1๊ฐ(uniqueํ)์ธ challenges_created
๊ฐ๋ค์ ์์๋ด์ผ ํ๋ค. ์ด์ ๋ํ SQL ๊ตฌ๋ฌธ ํ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT sub2.challenges_created
FROM (SELECT hacker_id, COUNT(*) AS challenges_created
FROM Challenges
GROUP BY Challenges.hacker_id) sub2
GROUP BY sub2.challenges_created
HAVING COUNT(*) = 1
์ฐ์ ์ ์ฝ๋์ ์๋ธ์ฟผ๋ฆฌ์ ์ญํ ์ hacker_id
๋ณ๋ก ๋ฌธ์ ๋ฅผ ๋ช ๊ฐ๋ฅผ ๋ง๋ค์๋์ง ์ฟผ๋ฆฌํ๋ ์ญํ ์ ํ๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ ํํ๊ฐ ๋์ฌ ๊ฒ์ด๋ค. ํ๋จ์ ํ
์ด๋ธ์ ๊ฐ๋ค์ ๋ฌธ์ ์ ์ฐ๊ด์ด ์๋ ๊ฐ๋ค์ด๋ค. ์ถ๋ ฅ ์นผ๋ผ๋ค๋ง ๋์ผํ ๋ฟ!
hacker_id | challenges_created |
1 | 8 |
2 | 12 |
3 | 20 |
4 | 20 |
5 | 24 |
๊ทธ๋ฆฌ๊ณ ์ ํ
์ด๋ธ ํํ์์ ๋ง๋ ๋ฌธ์ ๊ฐ์์ธ challenges_created
๋ฅผ ๊ทธ๋ฃนํ์ผ๋ก ํด์ ๋์ผํ challenges_created
๊ฐ์ด ๋ช ๊ฐ๋์๋์ง ์ถ๋ ฅํ๊ณ ์ด ๋ 1๊ฐ์ธ ๊ฐ๋ค๋ง ์ถ๋ ฅํด์ค๋ค. ๋ฐ๋ผ์ ์ SQL ๊ตฌ๋ฌธ์ ์ํํ ์ต์ข
์ถ๋ ฅ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.(์ ์ฝ๋๋ฅผ ์ํํ๋ฉด ํ๋จ ํ
์ด๋ธ์ COUNT(*) ์นผ๋ผ์ ๋์ค์ง ์๋๋ค๋ ์ ์ฐธ๊ณ ํ์.)
challenges_created | COUNT(*) |
8 | 1 |
12 | 1 |
24 | 1 |
2. ์ด์ challenges_created
๊ฐ์ ์ต๋๊ฐ์ ๊ตฌํด๋ณด์. ์ด์ ๋ํ SQL ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT MAX(sub1.challenges_created)
FROM (SELECT COUNT(*) AS challenges_created
FROM Hackers
INNER JOIN Challenges ON Hackers.hacker_id = Challenges.hacker_id
GROUP BY Hackers.hacker_id) sub1
1๋ฒ ๋จ๊ณ์ ๋นํด ๋น๊ต์ ๊ฐ๋จํ๋ค. ์ ์ฝ๋์ ์๋ธ์ฟผ๋ฆฌ ๋ถ๋ถ์ 1๋ฒ ๋จ๊ณ์ ์๋ธ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ๊ณผ ํ๋ ์ญํ ์ด ๋์ผํ๋ค. ์ฐจ์ด์ ์ MAX()
๋ฅผ ์ทจํด์ฃผ์๋ค๋ ๊ฒ!
3. ๋ง์ง๋ง์ผ๋ก ์ 1, 2๋ฒ ์กฐ๊ฑด์ ์ถฉ์กฑ์ํค๋ challenges_created
๋ฅผ ๊ฐ๋ hacker_id
, name
์ ์ถ๋ ฅ์ํค๊ณ challenges_created
๊ธฐ์ค์ผ๋ก ์ฐ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ํ ๋์ผํ challenges_created
๊ฐ์ ๊ฐ๋ ๋ฐ์ดํฐ๋ค ๊ฐ์๋ hacker_id
๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์์ผ์ฃผ๋ฉด ๋๋ค. ์ ์ฒด์ ์ธ SQL ํ์ด ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT Hackers.hacker_id, Hackers.name, COUNT(*) AS challenges_created
FROM Hackers
INNER JOIN Challenges ON Hackers.hacker_id = Challenges.hacker_id
GROUP BY Hackers.hacker_id, Hackers.name
HAVING challenges_created IN (SELECT sub2.challenges_created
FROM (SELECT hacker_id, COUNT(*) AS challenges_created
FROM Challenges
GROUP BY Challenges.hacker_id) sub2
GROUP BY sub2.challenges_created
HAVING COUNT(*) = 1)
OR challenges_created = (SELECT MAX(sub1.challenges_created)
FROM (SELECT COUNT(*) AS challenges_created
FROM Challenges
GROUP BY Challenges.hacker_id) sub1)
ORDER BY challenges_created DESC, Hackers.hacker_id