데이터 분석가로 살아남기
[HackerRank] Symmetric Pairs - MySQL 풀이 본문
안녕하세요, 준브로입니다.
코딩테스트 문제 풀이 플랫폼인 '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을 통해 합쳐주는 것이 훨씬 편하게 다가왔습니다!
도움이 되셨길 바라며, 다음 포스팅에서 찾아뵙겠습니다.
감사합니다!
'SQL' 카테고리의 다른 글
[HackerRank] New Companies - MySQL 풀이 (JOIN할 때 우리가 놓칠 수 있는 것) (0) | 2023.06.15 |
---|---|
[LeetCode] 181. Employees Earning More Than Their Managers - MySQL 풀이 (0) | 2023.05.31 |
[LeetCode] 1179. Reformat Department Table - MySQL 풀이 (0) | 2023.05.30 |
[Leetcode] 183. Customers Who Never Order - MySQL 풀이 (0) | 2023.05.30 |
데이터리안 SQL 데이터 분석 캠프 [입문반] 17기 후기 (1) | 2023.05.30 |