코딩 테스트/MySQL

[HackerRank] Symmetric Pairs

알밤바 2025. 8. 11. 11:05
728x90
반응형
 

Symmetric Pairs | HackerRank

Write a query to output all symmetric pairs in ascending order by the value of X.

www.hackerrank.com


문제

 

문제 접근 방식

두 쌍(X1, Y1)과 (X2, Y2)가 X1 = Y2이고 X2 = Y1일 때 대칭 쌍이라고 하며, 대칭 쌍을 구하면 된다.

대칭 쌍 중에 X1 <= Y1인 행만 출력하고 X 값 기준으로 오름차순 정렬하면 된다.

 

1) 대칭 쌍 구하기

X1 = Y2이고 X2 = Y1인 행을 구하는 방법은 조인을 하는 것이다.

FUCTIONS 테이블을 셀프 조인하며, ON절에 X1 = Y2, X2 = Y1 조건을 걸어주면 된다.

위와 같이 하면 대칭 쌍만 남는데 대칭이 되는 2개의 행이 같이 출력된다.

ex.

20 3 3 20

3 20 20 3

그렇기에 X1 <= Y1인 1개의 행을 남기기 위한 조건을 추가해야 한다.

 

2) X1 <= Y1인 행 출력

X1과 Y1이 다른 경우에는,

WHERE 절을 활용하여 X1 < Y1 조건을 추가해준다.

 

X1과 Y1이 같은 경우에는,

모든 컬럼의 값이 동일한 행이 2개 생기는 것이기 때문에 GROUP BY로 값 별 행 수를 집계하고 행 수가 2개 이상인 조건을 걸어주면 된다.

 

2가지 조건 모두 HAVING절에 추가하면 된다.

 

마지막으로 X값 기준으로 오름차순 정렬하면 끝.

 

SELECT A1.X, A1.Y
FROM FUNCTIONS A1
INNER JOIN FUNCTIONS A2
    ON A1.X = A2.Y
    AND A1.Y = A2.X
GROUP BY A1.X, A1.Y
HAVING (COUNT(1) > 1) OR (A1.X < A1.Y)
ORDER BY A1.X
;

 

 

나는 처음에 아래의 쿼리로 풀었다.

X1, Y1이 같은 경우, 다른 경우를 각각 구해서 UNION ALL로 합쳐서 구했다.

하지만 합쳐서도 구할 수 있는 문제였음! (위 쿼리 참고)

 

SELECT TB.X, TB.Y
FROM (
    SELECT A1.X, A1.Y
    FROM FUNCTIONS A1
    INNER JOIN FUNCTIONS A2
        ON A1.X = A2.Y
        AND A1.Y = A2.X
    WHERE A1.X < A1.Y
    UNION ALL
    SELECT X, Y
    FROM FUNCTIONS
    GROUP BY X, Y
    HAVING COUNT(1) > 1
) TB
ORDER BY TB.X
;

 

728x90
반응형

'코딩 테스트 > MySQL' 카테고리의 다른 글

[HackerRank] Weather Observation Station 18  (2) 2025.08.14
[HackerRank] Occupations  (3) 2025.08.12
[HackerRank] Placements  (2) 2025.08.08
[HackerRank] SQL Project Planning  (1) 2025.08.07
[HackerRank] Contest Leaderboard  (3) 2025.08.06