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
;
'코딩 테스트 > 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 |