반응형
https://solvesql.com/problems/friend-group-of-3/
https://solvesql.com/problems/friend-group-of-3/
solvesql.com
🎯 문제 상황
소셜 네트워크 데이터를 분석하는 과정에서, 세 명의 사용자가 서로 친구 관계를 맺고 있는 "삼각형 구조"를 찾아야 합니다. 주어진 edges 테이블에는 (A, B) 형태의 친구 관계만 저장되어 있습니다.
우리의 목표는:
- 두 단계를 거쳐 (A, B, C) 형태의 친구 관계를 찾고,
- 최종적으로 (A, C) 관계까지 확인하여 실제 삼각관계를 필터링하는 것입니다.
- 특정 사용자(예: 3820)가 포함된 삼각형만 출력합니다.
🎯 문제 해결 흐름
Step 1: A-B-C 관계 찾기
- edges 테이블을 두 번 조인하여 (A → B → C) 관계를 생성합니다.
- E1.user_a_id → E1.user_b_id → E2.user_b_id 순서로 친구 연결을 확장합니다.
- 결과적으로 (A, B, C) 형태의 데이터셋을 만듭니다.
이렇게 하면 user_a_id → user_b_id → user_c_id 연결 구조가 만들어집니다.
Step 2: A-C 관계 확인
이제 (A, C) 관계가 실제로 존재하는지 검증해야 합니다. edges 테이블과 다시 조인하여 (A, C) 또는 (C, A) 관계가 있는 경우만 필터링합니다.
이렇게 하면 (A, C) 관계가 존재하는 삼각형만 남게 됩니다.
Step 3: 최종 결과 필터링
- 같은 삼각형이 여러 번 나오는 것을 방지하기 위해 user_a_id < user_b_id < user_c_id 조건을 추가합니다.
- 특정 사용자가 포함된 삼각형만 출력합니다 (예: 3820).
이제 3820이 포함된 모든 친구 삼각형이 출력됩니다.
🎯쿼리
WITH ab AS (
SELECT E1.user_a_id, E1.user_b_id, E2.user_b_id AS user_c_id
FROM edges AS E1
JOIN edges AS E2
ON E1.user_b_id = E2.user_a_id
),
ac AS (
SELECT ab.user_a_id, ab.user_b_id, ab.user_c_id
FROM ab
JOIN edges AS E3
ON ((ab.user_a_id = E3.user_a_id AND ab.user_c_id = E3.user_b_id)
OR (ab.user_a_id = E3.user_b_id AND ab.user_c_id = E3.user_a_id))
)
SELECT *
FROM ac
WHERE user_a_id < user_b_id
AND user_b_id < user_c_id
AND 3820 IN (user_a_id, user_b_id, user_c_id)
🎯핵심 문법 설명
📝 1. SELF JOIN 활용
- 같은 테이블을 두 번 이상 조인하여 관계를 확장할 수 있습니다.
- 본 문제에서는 edges 테이블을 두 번 조인하여 A-B-C 관계를 찾고, 한 번 더 조인하여 A-C 관계를 확인했습니다.
📝 2. OR 조건을 활용한 대칭 관계 확인
- 친구 관계는 (A, B) 또는 (B, A)로 저장될 수 있습니다.
- (A, C) 관계 확인 단계에서 OR 조건을 추가하여 대칭적 친구 관계를 고려했습니다.
🎯 마무리
이번 SQL 쿼리는 소셜 네트워크에서 삼각관계(클러스터링 구조)를 찾는 문제를 해결했습니다. WITH AS를 활용한 구조화된 접근 방식을 사용하여:
- (A → B → C) 관계를 구성하고,
- (A, C) 관계를 확인하여 삼각형 필터링한 후,
- 3820이 포함된 삼각형만 출력하는 방식으로 문제를 해결했습니다.
이 방법을 활용하면, 친구 네트워크의 밀도를 분석하거나 추천 시스템을 설계하는 데에도 활용할 수 있습니다!
반응형
'SQL' 카테고리의 다른 글
| [SQL/solvesql LV3] 초기 사용자의 친구 관계 찾기 (0) | 2025.12.22 |
|---|---|
| [SQL/solvesql LV2] 이틀 연속 미세먼지가 나빠진 날 (0) | 2025.12.07 |
| [SQL/프로그래머스 LV3] 멀티 플랫폼 게임 찾기 (0) | 2025.02.05 |
| [SQL/프로그래머스 LV3] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (4) | 2025.01.17 |
| [SQL/프로그래머스 LV.3] 헤비 유저가 소유한 장소 (3) | 2025.01.16 |