본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Friend Requests II: Who Has the Most Friends

by kime2 2024. 7. 24.
출처

 

문제

가장 많은 친구와 가장 많은 친구 수를 가진 사람들을 찾는 솔루션을 작성하십시오.
테스트 케이스는 한 사람만 가장 많은 친구를 갖도록 생성됩니다.

문제에 대한 해석




 

친구가 가장 많은 사람을 뽑는 것으로 각 id에서 가장 많은 id를 추출하면 된다

requester_id별 친구의 개수
accepter_id 별 친구의 개수
select requester_id, count(*) as 're_num'
from RequestAccepted
group by requester_id
select accepter_id, count(*) as 'acc_num'
from RequestAccepted
group by accepter_id

 

문제1.

requester_id에만 아이디가 있거나 

accepter_id에만 아이디가 있을 수 있으니 full outer join을 해야한다

단, mysql에는 fiull outer join이 없으니 left,right join을 uion으로 합쳐주면 된다

 

문제2. ifnull의 사용

각각 left,right조인을 해주었기 때문에 requester_id또는 accepter_id에 값이 없는 경우 num컬럼은 null이된다.

이때 re_num + acc_num 연산중 null 이 있을 경우 null아 반환됨으로 각 컬럼에 null일 경우 0으로 치환해줘야 한다

 

with re as (
select requester_id, count(*) as 're_num'
from RequestAccepted 
group by requester_id 
),
acc as (
select accepter_id, count(*) as 'acc_num'
from RequestAccepted 
group by accepter_id
)

select re.requester_id  as 'id', ifnull(re.re_num,0) + ifnull(acc.acc_num,0) as 'num'
from 
re left JOIN acc
on re.requester_id = acc.accepter_id
union 
select acc.accepter_id as 'id', ifnull(re.re_num,0) + ifnull(acc.acc_num,0) as 'num'
from 
re right JOIN acc
on re.requester_id = acc.accepter_id
order by num desc
limit 1

 

다른사람 풀이

with base as (
    select requester_id as 'id'
    from RequestAccepted 
    union all
    select accepter_id as 'id'
    from RequestAccepted
)

select id, count(*) as 'num'
from base
group by id
order by num desc
limit 1

각 id에서 가장 많은 id를 추출하는 가장 쉬운 방법인듯..

requester_id와 accepter_id를 같은 컬럼으로 합치고(단, 중복이 제거되지 않도록 union all로 함)

합친 컬럼에 대해 구룹화 하여 수를 집계하였다