문제 링크: www.hackerrank.com/challenges/symmetric-pairs/problem?h_r=internal-search
문제. 짝꿍찾기
- 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으로 합쳐줍니다.
'Today I Learned > SQL 문제풀이' 카테고리의 다른 글
leetcode 1907. Count Salary Categories (열 -> 행으로 변환) (0) | 2023.12.29 |
---|---|
leetcode 1280. Students and Examinations (cross join) (1) | 2023.12.22 |
[해커랭크] Top Competitors (0) | 2020.11.28 |
[leetcode] Department Highest Salary (윈도우함수) (0) | 2020.11.21 |