📌 문제 목표
- 목표 : 테이블에서 이런 대칭 쌍들을 모두 찾기.
- 출력
- X 기준 오름차순으로 정렬.
- X ≤ Y 조건을 만족하는 행만 보이기.
- 즉 (X, Y)와 (Y, X)가 있더라도, 작은 값을 X에 두는 쪽만 출력.
📌 문제 해결 접근 과정
1. 대칭 쌍의 정의
- 두 행 (X1, Y1)과 (X2, Y2)가 있을 때
X1 = Y2 그리고 X2 = Y1이면 대칭 쌍(pair) 이다. - 즉, (X,Y)와 (Y,X)가 모두 존재해야 대칭이다.
2. 경우를 나누는 이유
대칭 쌍은 두 가지 경우가 존재합니다
- 서로 다른 값인 경우: X < Y
- (a,b)와 (b,a)가 둘 다 있는지 확인
- 같은 값인 경우: X = Y
- (a,a) 한 번만 있으면 대칭이라 할 수 없음
- 최소 2회 이상 존재해야 서로 반영된 대칭으로 인정
3. 해결 방법
- 서로 다른 값 (X < Y)
→ Functions 테이블을 셀프 조인해서 (X,Y)와 (Y,X)가 모두 있는 경우만 선택 - 같은 값 (X = Y)
→ GROUP BY 후 HAVING COUNT(*) > 1로 중복 존재 여부 확인 - 두 결과를 UNION으로 합쳐 최종 출력
4. 핵심 주의점
- X = Y인 경우는 반드시 중복 여부 확인 필요
- 대칭의 정의상, 단일 (a,a)는 자기 자신만 있을 뿐 대칭이 아님
- 따라서 HAVING COUNT(*) > 1 조건으로 필터링
[최종 작성 쿼리]
SELECT DISTINCT f1.X, f1.Y
FROM Functions f1
JOIN Functions f2
ON f1.X = f2.Y
AND f1.Y = f2.X
WHERE f1.X < f1.Y
UNION
SELECT X, Y
FROM Functions
WHERE X = Y
GROUP BY X, Y
HAVING COUNT(*) > 1
ORDER BY X ASC, Y ASC;
셀프조인을 사용하는 경우
: 같은 테이블 안에서 행과 행을 비교해야하는 경우
- 직원-상사 구조
- 대칭/역관계 찾기
- 같은 그룹 안에서 짝짓기
- 네트워크/경로 역방향 확인
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [프로그래머스]Oracle SQL(Lv2,10문제) (0) | 2025.09.12 |
|---|---|
| [프로그래머스] Oracle SQL (Lv1, 24문제) (1) | 2025.09.11 |
| [Hacker Rank] SQL Intermediate 'Contest Leaderboard' (Medium) (0) | 2025.08.22 |
| [Hacker Rank] SQL Intermediate 'Top Competitors' (Medium) (0) | 2025.08.22 |
| [Hacker Rank] SQL Intermediate 'The Report' (Medium) (0) | 2025.08.22 |