코딩테스트/SQL 코드카타
MySQL 해커랭크 | Symmetric Pairs (셀프 조인)
ANNASENA
2024. 9. 3. 08:00
728x90
문제
https://www.hackerrank.com/challenges/symmetric-pairs/problem?isFullScreen=true
Symmetric Pairs | HackerRank
Write a query to output all symmetric pairs in ascending order by the value of X.
www.hackerrank.com
- 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
테이블
Functions 테이블 |
![]() |
# 조건에 맞는 답
- 20 20
- 20 21
- 22 23
→ 대칭되는 행이 존재함 : X1 = Y2이면서 X2= Y1이 되는 쌍이 있음
→ 두 값이 20, 20으로 같으면 X, Y가 대칭되기 때문에 조건에 맞는 답 같지만 아님
자기자신 외에 20, 20인 행이 하나 더 있어야 함
풀이과정
# 오답
- IN 함수를 사용해
X값이 Y값 리스트에 포함되어 있으면서 + Y값도 X값 리스트 안에 포함되어 있는 행들을 필터링하고자 함- 이 때 X <= Y인 행들만 조회하도록 함
- IN 함수를 쓰면 정확한 필터링이 되지 않고, 결과가 난잡해짐
- 이 쿼리문은 위 예시의 20, 20 처럼 'X = Y인 경우' 에 문제가 원하는 조건에 맞는 값을 출력하고 있지 못함
- X, Y의 값이 같으면 모두 출력하고 있음..
1 2 3 4 5 | -- 오답 SELECT X, Y FROM Functions WHERE (X IN(SELECT Y FROM Functions) AND Y IN(SELECT X FROM Functions)) AND X<=Y ORDER BY X | cs |
# 정답
- 셀프 조인을 통해 X, Y 컬럼 간의 비교를 수월하게 함
- 이 때 X < Y인 경우만 고려함
- X = Y인 경우, X와 Y로 그룹화 했을 때 카운트가 적어도 2번은 되는 행들만 조회되도록 필터링 함
즉, X = Y인 경우가 적어도 두 행은 있어야 조회하도록 함 - 셀프 조인한 테이블과 X = Y일 경우의 테이블을 UNION ALL 해줌
- X 오름차순 정렬까지 해주면 끝!
1 2 3 4 5 6 7 8 9 10 | SELECT F1.X, F1.Y FROM Functions F1, Functions F2 WHERE (F1.X = F2.Y AND F1.Y = F2.X) AND F1.X < F1.Y UNION ALL SELECT X, Y FROM Functions WHERE X = Y GROUP BY 1, 2 HAVING COUNT(X) > 1 ORDER BY X | cs |
728x90