[SQL Runday] HackerRank - Symmetric Pairs

X, Y 각각의 값을 갖는 테이블 Functions가 있다.

  • X1 = Y2, X2 = Y1 조건을 만족한다면 (X1, Y1), (X2, Y2) 두 값은 대칭쌍이다.(Symmetric pairs)
  • 모든 대칭 쌍을 출력하는 쿼리를 작성해라.
  • X 값 기준으로 오름차순 정렬해라.
  • X1 <= Y1인 값만 조회해라.

Table


다음과 같은 X, Y 값을 갖는 테이블 Functions가 있다.


Key points

  • 1,10, 10, 1 < 이렇게 대칭을 이루는 쌍을 찾아야 함.
  • 출력은 1,10 < 이 쌍만 하면 됨.
  • 우선 X1 = Y2 두 값을 기준으로 Join 해야 겠다는 생각을 했음.
  • 그리고 where 조건으로 X2 = Y1를 만족하는 행들만 조회하고, f.X <= f.Y 조건을 추가하면 되겠다고 생각함

Errors

  • 그러자 문제가 생겼는데, 어차피 똑같은 테이블이므로 자기 자신과 똑같은 행도 대칭 쌍처럼 조회가 되었음.
  • 2 2 값을 갖고 있는 행이 2 2 2 2 이렇게 다 조회가 됨.
  • 그게 아니라 2 2 값을 갖고 있으면 자기 자신 아닌 다른 행이 2 2 여야 2 2 가 대칭쌍으로 받아들여지는 것.
  • 이를 해결하기 위해 row_index 변수를 각 테이블 마다 만들었음.
  • 전 문제도 이런식으로 풀었는데 이렇게 하는게 좋은 방법인지는 모르겠다?
  • 그런데도 마지막에 13 13 < 이게 두 번 찍혀서
  • distinct로 한번만 불러오게 조회함.
  • 이게 맞는 방법인지는 확실하지 않다. 다른 사람은 어떻게 풀었는지 discussion 확인해봐야 할듯.

최종 쿼리

set @index = 0;
set @index1 = 0;
select distinct f.X, f.Y
from (select X, Y, @index:= @index+1 as row_index from functions)f
inner join(select X, Y, @index1:= @index1+1 as row_index1 from functions)f1
on f.X = f1.Y
where f.Y = f1.X and f.X <= f.Y and row_index != row_index1
order by f.X

좋은 웹페이지 즐겨찾기