728x90
📚문제
📝풀이
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가지 모두 해주어야 대칭되는 행 값을 찾을 수 있다
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
'SQL > HackerRank (SQL문풀)' 카테고리의 다른 글
**Hackerrank / Aggregation / Weather Observation Station 20 / MySQL ** (0) | 2024.01.08 |
---|---|
Advanced Select / Occupations / MySQL (0) | 2023.11.21 |
Hackerrank / Advanced Join / Placements / MySQL (0) | 2023.10.19 |
Hackerrank / Advanced Select / The PADS / MySQL (0) | 2023.10.19 |
HackerRank / Basic Join / The Report / MySQL (0) | 2023.10.10 |