코딩테스트/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 12
HAVING COUNT(X) > 1
ORDER BY X
cs

728x90