๐ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ(HackerRank)
Q. hackers ํ ์ด๋ธ๊ณผ challenges ํ ์ด๋ธ์์ ํด์ปค๋ณ๋ก ์ถ์ ํ challenge ์๋ฅผ ์ถ๋ ฅํ๋ผ. challenge ์๊ฐ ๊ฒน์น ๋ challenge ์๊ฐ ์ต๊ณ ๋ผ๋ฉด ์ ๋ถ ์ถ๋ ฅํ๋ผ. challenge ์๊ฐ ๊ฒน์น๋๋ฐ ์ต๊ณ ๊ฐ ์๋๋ผ๋ฉด ์ ๋ถ ์ ๊ฑฐํ๋ผ
ex)
INPUT | OUTPUT | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
์ค๋ช
์ ๊ฐ๋จํ๊ฒ ์ํด ์๋ตํ์ง๋ง
์ค์ ๋ก๋ hacker_id, hacker_name, challenge ์๋ฅผ ์ถ๋ ฅํด์ผํ๋ค.
์กฐ๊ฑด๋ณ๋ก ์ถ๋ ฅ์ ๋ฌ๋ฆฌํด์ผํ๋ ๊ดด๋ํ ๋ฌธ์ ์ด๋ค.
windowํจ์
์ฌ์ฉ์ด ํ์์ ์ด๋ค. ๋ชจ๋ฅธ๋ค๋ฉด ์์ ํ ์๊ฐ ์๋ค.
์ง๋ ๊ฐ๋น์์ฝ๋ฉํ
์คํธ ๋ฌธ์ ์์ ๊ฑฐ์ ๋์ผํ ์ ํ์ ํ์ด๋ณด์์ ์ด๋ป๊ฒ๋ ํ์ด๋ธ ๊ฒ ๊ฐ๋ค.
# mysql
select
h.hacker_id
, h.name
, handc.total_number
from
hackers h
, (
select
h.hacker_id
, count(*) total_number
from
hackers h
, challenges c
where
h.hacker_id = c.hacker_id
group by
h.hacker_id
) handc
, (
select
count(*) max_number
from
hackers h
, challenges c
where
h.hacker_id = c.hacker_id
group by
h.hacker_id
order by 1 desc
limit 1
) max_count
where
h.hacker_id = handc.hacker_id
and handc.total_number = max_count.max_number
union all ###############################################
select
hcrn.hacker_id
, h.name
, hcrn.total_number
from
hackers h
, (
select
count(*) over(partition by rnk) cnt
, hacker_id
, total_number
from
(
select
dense_rank() over(order by count(*) desc) rnk
, h.hacker_id
, count(*) total_number
from
hackers h
, challenges c
where
h.hacker_id = c.hacker_id
group by
h.hacker_id
) hc
where rnk > 1
) hcrn
where
h.hacker_id = hcrn.hacker_id
and cnt = 1
order by
3 desc
, 1
;
hackers
hackers
์ challenges
๋ฅผ ์กฐ์ธํ์ฌ group by ํ ํ
์ด๋ธ์ต๋ ์
๋ฅผ ๊ฐ์ง one์ปฌ๋ผ one๋ฐ์ดํฐ ํ
์ด๋ธhackers
challenge ์๋ฅผ ๋ญํฌ
ํ๊ณ ์ค๋ณต๋๋ ๊ฐฏ์๋ฅผ ๊ณ์ฐ
ํ ํ
์ด๋ธselect
hacker_id
, name
, total_number
from
(
select
h.hacker_id
, h.name
, count(*) total_number
, rank() over(order by count(h.hacker_id) desc) rnk
from
hackers h
, challenges c
where
h.hacker_id = c.hacker_id
group by
h.hacker_id, h.name
) handc
where
rnk = 1
union all
select
hacker_id
, name
, total_number
from
(
select
h.hacker_id
, h.name
, count(*) total_number
, dense_rank() over(order by count(*) desc) rnk
, count(count(*)) over(partition by count(*)) cnt
from
hackers h
, challenges c
where
h.hacker_id = c.hacker_id
group by
h.hacker_id, h.name
) hc
where
cnt = 1
and rnk > 1
order by
3 desc
, 1
;
์๋์ฐ ํจ์์ ๋์๋ฐฉ์์ ์ดํดํ๋ฉด ์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค.
์๋์ฐ ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก group by์ ์ปฌ๋ผ๊ตฌ๋ถ์ ๋ฐ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ค์ ๊ทธ ์์์ count(count(*))๋ฅผ ํ๋ ๋ฐฉ์์ผ๋ก ์ค๋ณต์๋ฅผ ๊ตฌํ๋ค.
discussionํญ์์ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ต๋ณ์ ๋ณด๋ ์ค ์์ฒญ๋๊ฒ ์ต์ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ๋ค.
๋น์ทํ ์ ํ์ ๋ฌธ์ ๋ค์ ํ ๋ ์์ฒญ๋๊ฒ ๋์์ด ๋ ๋ฏ ํ๋ฐ
๊ตฌ๋ฌธ์ ์ค์ด๋๊ฒ ๋ฏธ์น๋ฏ์ด ํจ์จ์ ์ด๋ผ ์คํ๋ ค ์ฒ์๋ณด๋ ์ฌ๋์ '์ด๊ฒ ๋ญ์ง' ์ถ์์ ์๊ฒ ๋ค...
์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๊ณ windowํจ์ ์์ ์ง๊ณํจ์๋ฅผ ๋ฃ์ด์โ ๏ธ '์ค๋ณต ๋ ์นด์ดํธ'๋ฅผ ์ธ๊ณ
WHERE ์ ์ ์ค๋ณต์กฐ๊ฑด์ NOT์ ๊ฑธ์ด์โ ๏ธ ์ต๊ณ ์ ์ผ๋์ ์๋๋๋ฅผ ์ ๋ถ ์์ฐ๋ฅด๋ ์กฐ๊ฑด์ ์ค์ ํ๋ค.
์ ๋ง ๋๋ํ ์ฌ๋์ ๋ง์ ๊ฒ ๊ฐ๋ค... ๋ถ๋ฐํ์๐ญ
SELECT
hacker_id
, name
, totalcount
FROM
(
SELECT
Hackers.hacker_id,
name,
COUNT(challenge_id) AS totalcount,
COUNT(COUNT(challenge_id)) OVER (PARTITION BY COUNT(challenge_id)) as dupes,
MAX(COUNT(challenge_id)) OVER () as max
FROM
Hackers
LEFT JOIN Challenges USING(hacker_id)
GROUP BY
Hackers.hacker_id, name
) B
WHERE
NOT (dupes >1 && totalcount < max)
ORDER BY
totalcount desc
, hacker_id