본문 바로가기

SQL/HackerRank (SQL문풀)

Hackerrank / Advanced Join / Symmetric Pairs / MySQL

728x90

📚문제

출처 : Hackerrank(https://www.hackerrank.com/challenges/symmetric-pairs/problem?isFullScreen=true)

 

📝풀이

SELECT F1.X
     , F1.Y
FROM Functions F1
INNER JOIN Functions F2 ON F1.X = F2.Y AND F1.Y = F2.X
GROUP BY F1.X,F1.Y
HAVING COUNT(F1.X) >=2 # (20,20)처럼 2쌍이 중복인 경우 
   OR (F1.X<F1.Y) # (x1<y1)조건 만족하는 경우 
ORDER BY F1.X

 

 

처음에 문제를 이해하는것도 너무 어려웠다

간단하게 말하면 대각선으로 그려서 X자모양을 만들때 (X자의 크기는 상관없이)

"서로 다른 두 행 안에 대칭되는 값이 들어있는지" 를 보면 된다

이 때 

1) (x1 = y2) and (x2=y1)

=> Self join 해주면 된다

=> 이때 ON 조건을 위에 2가지 모두 해주어야 대칭되는 행 값을 찾을 수 있다

Sample Input 예시

 

2) x= y 라면 똑같은 순서쌍이 2개 이상 있어야 대칭이 된다

(ex (20,20) 

      (20,20)

3) x1 <= y1 

그래서 (23,22)는 답이 될 수 없다

 

 


SELECT *
FROM Functions f1
INNER JOIN Functions f2 ON f1.Y = f2.X AND f1.X = f2.Y
GROUP BY f1.X , f1.Y
HAVING COUNT(*) >= 2
    OR f1.X < f1.Y
ORDER BY f1.X

문제 이해하고 

SELF JOIN까지는 잘 풀었는데 

중간에 GROUP화 하지 않고 풀어서

문제가 생겼다

 

SELECT *
FROM Functions f1
INNER JOIN Functions f2 ON f1.Y = f2.X AND f1.X = f2.Y
WHERE f1.X < f1.Y
ORDER BY f1.X

이렇게 X와 Y가 같은 경우를 포함하지않으면

(13,13) 과 (13,13)처럼 두 번나오는 쌍이 포함되지 않고

그렇다고 등호를 넣어주면

이렇게 1번 등장하는 경우가 다 포함이 된다

 

이런 경우 때문에 

1. GROUP화 한 뒤에  HAVING조건으로 COUNT(*)>=2인 경우

2. f1.X < f1.Y인 경우

2가지 상황을 OR조건으로 연결해주어야한다

 

728x90