Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

데이터 분석가로 살아남기

[HackerRank] Symmetric Pairs - MySQL 풀이 본문

SQL

[HackerRank] Symmetric Pairs - MySQL 풀이

junbro 2023. 5. 26. 19:31

 안녕하세요, 준브로입니다. 

코딩테스트 문제 풀이 플랫폼인 'HackerRank'에서 SQL 문제를 풀면서 연습하고 있는데요, 

오늘 풀어볼 문제는 'Symmetric Pairs'입니다. 문제를 먼저 살펴보죠.


Symmetric Pairs 문제 설명

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.

Sample Input

Sample Output

20 20
20 21
22 23

문제 해석

- functions 테이블은 x, y 컬럼 2가지로 구성되어 있습니다. 

- 두 가지 순서쌍 (x1, y1)과 (x2, y2)가 다음 조건을 만족할 때 우리는 'Symmetric pairs'라고 정의합니다. 

- x1 = y2 와 x2 = y1 조건 만족시키는 symmetric pairs를 찾는 쿼리를 작성하면 됩니다.

 

정렬 조건

- x 값에 대한 '오름차순(ascending order)'으로 정렬

- x1 <= y1 의 조건으로 출력할 것.

 

예를 들어, (10, 12)와 (12, 10)을 발견했다면, (10, 12)만 출력될 수 있도록 하는 것입니다. 

 


문제 풀이 

 

위 문제를 풀 때, 두 가지 조건을 설정하여 하나씩 풀이하고 결과 값을 'UNION'으로 합하려고 합니다.  

1. symmetric pairs if (x1, y1) = (x2, y2) - 즉, 두 순서쌍이 완전히 같은 경우

2. symmetric pairs if x1 = y2 AND x2 = y1 - 즉, 주어진 조건을 만족하면서 x1 < y1의 조건까지 만족하는 경우

 

 

1. symmetric pairs if (x1, y1) = (x2, y2)

SELECT x, y
FROM functions
WHERE x = y  -- x와 y 값이 같은 경우 조건
GROUP BY x, y
HAVING COUNT(*) = 2 -- 두개의 쌍이 존재해야 하므로 HAVING절에 집계함수 COUNT 조건을 줌

결과: (13, 13) 순서쌍이 출력되었습니다.

 

2. symmetric pairs if x1 = y2 AND x2 = y1 

SELECT f1.x
     , f1.y
FROM functions AS f1 
    INNER JOIN functions AS f2 ON f1.x = f2.y AND f1.y = f2.x -- 두 테이블 f1, f2를 조인
WHERE f1.x < f1.y  -- x1 < y1 조건을 설정 (등호 '='가 들어가지 않은 이유는 1번에서 다뤘기 때문.)
ORDER BY f1.x  -- x 값을 기준으로 오름차순 정렬

결과: 조건에 맞는 결과값들이 출력되어 있습니다. 

 

3. UNION으로 최종 결과 도출 

SELECT x, y
FROM functions
WHERE x = y
GROUP BY x, y
HAVING COUNT(*) = 2

UNION  -- 1과 2의 쿼리를 합쳐줌 (중복 제거 default)

SELECT f1.x
     , f1.y
FROM functions AS f1 
    INNER JOIN functions AS f2 ON f1.x = f2.y AND f1.y = f2.x
WHERE f1.x < f1.y
ORDER BY x  -- 합친 두 쿼리를 한번에 정렬 (x로 수정)

결과: 

정답으로 실행이 되었고, 이대로 제출해주시면 됩니다. 

 


처음에 문제를 접근할 때, 하나의 쿼리에 모든 조건을 다 넣으려고 하니 계속해서 막혔습니다. 

이런 문제를 접할 때는 case를 적절히 쪼개서 접근한 다음, UNION을 통해 합쳐주는 것이 훨씬 편하게 다가왔습니다! 

 

 

도움이 되셨길 바라며, 다음 포스팅에서 찾아뵙겠습니다. 

감사합니다!