[SQL] HackerRank Symmetric Pairs

G ON·2025년 5월 8일

SQL

목록 보기
21/21
post-thumbnail

Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1. Write a query to output all such symmetric pairs in ascending order by the value of X. List the rows such that X1 ≤ Y1

1. 중복(역순) 제거를 위해 X₁ ≤ Y₁ 인 쌍만 보여줄 것
2. 결과를 X 값 기준으로 오름차순 정렬할 것

-- 1) 대칭 쌍의 “첫 번째 값”(X₁)과 “두 번째 값”(Y₁)”을 선택
SELECT
    f1.X AS X,
    f1.Y AS Y

-- 2) Self-Join: 테이블을 f1, f2로 두 번 읽어 “모든 대칭 조합”을 찾는다
FROM Functions AS f1
INNER JOIN Functions AS f2
    ON f1.X = f2.Y       -- (X₁ = Y₂)
   AND f1.Y = f2.X       -- (Y₁ = X₂)

-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ 조인 결과 예시 A:                                                         
-- │ 원본에 (20,21),(21,20),(20,20),(20,20)이 있을 때                         
-- │   (20,21)<->(21,20) → 2건                                                 
-- │   (20,20)x2건↔x2건 → 4건                                                 
-- └───────────────────────────────────────────────────────────────────────────┘
-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ 조인 결과 예시 B (단일행):                                               
-- │ 원본에 (20,21),(21,20),(20,20) 단 한 건만 있을 때                        
-- │   (20,21)<->(21,20) → 2건                                                 
-- │   (20,20)↔자기 자신 → 1건                                                 
-- └───────────────────────────────────────────────────────────────────────────┘

-- 3) 같은 (X,Y) 값끼리 묶어 “몇 번 매칭됐는지” 집계 준비
GROUP BY
    f1.X,
    f1.Y

-- 4) 그룹 단위 필터링:
--    • 자기-대칭 (X=Y) 은 원본에 2건 이상 있을 때만 → JOIN 후 COUNT(*)>1
--    • 서로 다른 대칭 (a,b)/(b,a) 은 a<b 인 쪽만 → f1.X < f1.Y
HAVING
     COUNT(*) > 1   -- (X=Y) 그룹이 JOIN 후 2건 이상 매칭된 경우만 통과
  OR f1.X <  f1.Y  -- (X≠Y) 그룹 중 작은 값이 X인 쪽만 통과

-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ HAVING 동작 예시 A:                                                       
-- │ • (20,20) 그룹: JOIN 결과 4건 → COUNT(*)=4>1 ⇒ 통과                      
-- │ • (20,21) 그룹: JOIN 결과 1건, 20<21 ⇒ 통과                              
-- │ • (21,20) 그룹: JOIN 결과 1건, 21<20 거짓 ⇒ 제외                        
-- │ • (22,23)/(23,22) 유사 방식                                             
-- └───────────────────────────────────────────────────────────────────────────┘
-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ HAVING 동작 예시 B (단일행):                                              
-- │ • (20,20) 그룹: JOIN 결과 1건 → COUNT(*)=1>1 거짓 ⇒ 제외                 
-- │ • (20,21) 그룹: COUNT=1, 20<21 ⇒ 통과                                     
-- │ • (21,20) 그룹: COUNT=1, 21<20 거짓 ⇒ 제외                               
-- └───────────────────────────────────────────────────────────────────────────┘

-- 5) X 값 기준 오름차순 정렬
ORDER BY
    f1.X ASC
    ;

0개의 댓글