본문 바로가기
데이터/SQL 문제풀이

HackerRank SQL - Symmetric Pairs

by 찌노오 2023. 2. 12.

 

You are given a table, Functions, containing two columns: X and Y.

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.

Problem

- 각각의 짝을 출력하는 쿼리를 작성하라.

- 단, X의 값을 기준으로 내림차순, X<=Y인 경우만 row로 출력하라.

 


Answer1

SELECT F.X, F.Y
FROM Functions F, Functions Temp_F
WHERE F.X = Temp_F.Y
  AND F.Y = Temp_F.X
GROUP BY F.X, F.Y HAVING COUNT(*)>=2 OR F.X < F.Y
ORDER BY F.X

이것도 풀고나면 쉬운 문제였는데 상당히 헤매었던 문제다.

처음부터 셀프 조인(self join)으로 접근하면 쉽게 풀 수 있었을텐데 계속 서브쿼리, 서브쿼리만 하다보니 쉽게 떠올리지 못했다.

물론 where절 서브쿼리로도 풀어 볼 수 있을 것 같은데, 다음으로 미뤄본다.

 


How to solve

처음에는 X를 기준으로 조건에 충족하는 Y만 뽑아서 저장하려고 서브쿼리를 생각해봤다.

하지만 애초에 성립이 불가능한 쿼리였다.

지금 생각하면 내가 뭘 하려고 했던 건지도 잘 모르겠다.

SELECT F.X
       ,(SELECT DISTINCT F2.Y 
         FROM Functions F2 
         WHERE F2.Y = F.Y
           AND concat(F.Y, F.X) = concat(F2.X,F2.Y)
         ) Y
FROM Functions F
GROUP BY F.X, Y HAVING COUNT(*) >= 2 OR F.X > Y
ORDER BY F.X

 

두 번째로 시도한 방법은 where절에 서브쿼리를 넣어보는 방법이었다.

역시 X의 값을 기준으로 조건에 충족하는 Y값만 가져오려는 방법이었는데, 이건 X=Y인 13만 추출되었다.

이 때, 애초에 저렇게 묶어버리면 HAVING절의 COUNT는 의미가 없어져 버린다.

SELECT F.X, F.Y
FROM Functions F
WHERE F.X IN (SELECT F2.Y
               FROM Functions F2
              WHERE CONCAT(F2.X, F.Y) = CONCAT(F2.Y, F.X)
              )
GROUP BY F.X, F.Y HAVING COUNT(*)>=2 OR F.X < F.Y
ORDER BY F.X

 

그래서 마지막으로 접근한 방법은 두 개의 같은 테이블에서 각각의 값의 위치를 바꿔 비교했을 때 같을 때만 추출하고, 이를 다시 HAVING롤 마무리 해보는 것이다.

여기에 혹시나 X가 1이고 Y가 19 이면 X+Y는 119가 되는데 Y가 11 X가 9이면  Y+X 역시 119 가 되기 때문에 concat함수 사이에 '바(|)'를 넣어 줬다. 이렇게 하니  정상적으로 추출된다.

SELECT F.X, F.Y
FROM Functions F, Functions Temp_F
WHERE CONCAT(F.X,'|',F.Y) = CONCAT(Temp_F.Y,'|',Temp_F.X) 
  AND CONCAT(F.Y,'|',F.X) = CONCAT(Temp_F.X,'|',Temp_F.Y)
GROUP BY F.X, F.Y HAVING COUNT(*)>=2 OR F.X < F.Y
ORDER BY F.X

다만, CONCAT(F.X,'|',F.Y) = CONCAT(Temp_F.Y,'|',Temp_F.X)는 F.X = Temp_F.Y와 동일한 조건이기에 굳이 저렇게 쓰기보다는 풀이처럼 간단하게 다시 바꿔주었다.

 

 

 

반응형

'데이터 > SQL 문제풀이' 카테고리의 다른 글

HackerRank SQL - Print Prime Numbers  (0) 2023.02.21
HackerRank SQL - Interviews  (2) 2023.02.13
HackerRank SQL - Placements  (1) 2023.02.05
HackerRank SQL - SQL Project Planning  (2) 2023.02.02
HackerRank SQL - Contest Leaderboard  (0) 2023.01.31

댓글