Today I Learned/SQL 문제풀이

[hackerrank] Symmetric Pairs

하나719 2020. 11. 5. 10:24
반응형

문제 링크: www.hackerrank.com/challenges/symmetric-pairs/problem?h_r=internal-search

 

Symmetric Pairs | HackerRank

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

www.hackerrank.com

문제. 짝꿍찾기

- X1 = Y2 and X2 = Y1

- X1 <= Y2

 

주의할 점

1 .X = Y 인 경우 같은 데이터가 하나 더 있어야지 짝꿍으로 쳐준다. 

sample input에서 첫째줄과 둘째줄에 20,20이 있는데, 만약 한줄만 있었으면 짝꿍이 없는것!

 

2. X <= Y 인 케이스만 적어주면 된다. 
sample input 에서 3번째줄, 6번째줄이 짝꿍인데 X <= Y 인 20, 21을 출력해주고 21,20은 출력해주지 않는다.

 

Solution1. ( sub query + if ) and (groupby + having)

SELECT sub.X, sub.Y
FROM (SELECT if(X <= Y, X , Y) as X, if(X <= Y, Y , X) as Y
      FROM Functions) sub
GROUP BY sub.X, sub.Y
HAVING count(*) >= 2
ORDER BY sub.X

1) subquery + if

- 주의사항 2에서 말한것처럼 우리는 pair중에 한쌍만 출력해주면 된다. 그래서 if 문으로 x보다 y가 크면 x자리에 y 넣어주고, y 자리에 x 넣어서 서로 바꾸어 주었다. (나중에 group by 에 활용)

예를들어 아래 테이블에서 1행과 2행은 짝꿍이라고 할 수 있는데 subquery안에서 2행의 x와 y를 교체해준다.

x y
1 2
2 1

2) group by + having

subquery에서 변경해준 테이블로 x,y 쌍을 group by 해준다.

having 절에서 count가 2보다 큰 쌍만 필터링 해준다.

주의사항 1처럼 x=y 이지만, 쌍이 한개인 컬럼은 여기서 필터링 되어서 포함되지 않는다.

 

Solution2. Join + union

(
# x! = y
SELECT f1.X, f1.Y
FROM Functions f1
    INNER JOIN Functions f2
        ON f1.X = f2.Y AND f1.Y = f2.X
WHERE f1.X < f1.Y 


UNION

# x = y
SELECT X,Y
FROM Functions
WHERE X=Y
GROUP BY X,Y
HAVING count(*) > 1
)

ORDER BY X

join을 사용해서 X1 = Y2 and X2 = Y1 인 경우를 쉽게 찾아줄 수 있습니다. 하지만, 이렇게 했을 때 X=Y 이지만 짝꿍이 없는 케이스가 포함되게 됩니다. 이를 해결하기 위해서  X = Y인 case와 X!=Y인 케이스를 각각 구해서 union으로 합쳐줍니다.

 

반응형