[MySQL] HackerRank) Symmetric Pairs

자두·2022년 9월 18일
post-thumbnail

문제 살펴보기
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.

요약하자면

맞는 짝 찾기

조건

  1. X1 = Y2  and  X2 = Y1.
  2. X1 ≤ Y1
  3. symmetric pairs in ascending order by the value of X _ X 기준 오름차순 정렬
SELECT * 
FROM Functions f1 INNER JOIN Functions f2
	ON f1.X = f2.Y AND  f1.Y = f2.X
ORDER BY f1.x

X1 = Y2 and X2 = Y1 에 따라 f1.X = f2.Y AND f1.Y = f2.X 으로 SLEF JOIN 해줌

WRONG ANSWER

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 f1.x < f1.y or f1.x = f1.y

ORDER BY f1.x

HAVING 절에서 X1 ≤ Y1 조건을 충족시켜주고 싶었지만 식이 틀림
중복값을 찾아주는 쿼리문을 작성해야함

왜 중복값을 찾아줘야하지?

X1 ≤ Y1 에서 이 X = Y 가 같은 값을 전부 찾아줘! 라는 소리가 아니었다.

단순히 X, Y 두 값이 각각 같은 쌍이 아니라 특정 X Y가 있다 했을 때 X Y 값이 서로 바뀌었을 때도 같은 값이 있는 페어를 찾아달란 소리였다. 즉 (3,4) (4,3) 이런 식의 값을 말이다.

문제 속 실례를 살펴봤을 때 이 2 24 24 2 같은 페어를 말이다.

최종정답

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) > 1 or f1.X < f1.Y

ORDER BY f1.X

중복값을 찾는 쿼리식을 써주면서 정답!

외전

JOIN없이 그냥 풀어봤을 때

SELECT f1.X, f1.Y
FROM Functions f1
GROUP BY f1.X, f1.Y
HAVING COUNT(f1.x) > 1 or f1.X < f1.Y
ORDER BY f1.x


보면 7 19 는 페어가 없어서JOIN없이 그냥 풀면

COUNT(f1.x) > 1 or f1.X < f1.Y 조건은 맞지만 페어가 없었기 때문에(페어가 없어서 JOIN 도 안된 상태) 틀림

profile
하고 싶은 일과 해야 하는 일을 병행하는 데이터 분석기

0개의 댓글