반응형
문제
Print Prime Numbers | HackerRank
1000 보다 작거나 같은 소수를 출력하는 쿼리를 작성합니다.
결과를 한 줄로 인쇄하고 '&' 문자를 구분 기호로 사용합니다.
예시) 10보다 작거나 같은 소수 출력
2&3&5&7
풀이
CONNECT BY LEVEL 구문으로 2이상 1000 이하의 ROW를 생성하고, WITH절을 사용하여 임시 테이블로 만들어 줍니다.
NOT EXISTS 조건으로 약수 여부를 확인해서 제외합니다.
결과를 한 줄로 표시하기 위해 LISTAGG 함수를 활용했습니다.
LISTAGG 함수 기본 사용법 (Oracle 11g 이상)
LISTAGG(컬럼명, '구분기호') WITHIN GROUP(ORDER BY 정렬 기준 컬럼)
WITH NUMBERS AS (
SELECT LEVEL NUM
FROM DUAL
WHERE LEVEL > 1
CONNECT BY LEVEL <= 1000
)
SELECT LISTAGG(N.NUM, '&') WITHIN GROUP(ORDER BY N.NUM)
FROM NUMBERS N
WHERE NOT EXISTS (SELECT NUM
FROM NUMBERS E
WHERE E.NUM < N.NUM
AND MOD(N.NUM, E.NUM) = 0
)
여기서 나누는 값의 범위를 제곱근(SQRT) 이하로 줄여도 동일한 결과값을 얻을 수 있습니다.
- E.NUM < N.NUM ☞ E.NUM <= SQRT(N.NUM)
약수는 제곱근 값을 기준으로 대칭이기 때문에, 제곱근 값보다 작거나 같은 수로만 나누어지면 그 이상의 숫자로는 계산할 필요가 없기 때문입니다.
예시) 12의 약수는 1, 2, 3, 4, 6, 12
1 * 12, 2 * 6, 3 * 4 < √12 < 4 * 3, 6 * 2, 18
WITH NUMBERS AS (
SELECT LEVEL NUM
FROM DUAL
WHERE LEVEL > 1
CONNECT BY LEVEL <= 1000
)
SELECT LISTAGG(N.NUM, '&') WITHIN GROUP(ORDER BY N.NUM)
FROM NUMBERS N
WHERE NOT EXISTS (SELECT NUM
FROM NUMBERS E
WHERE E.NUM <= SQRT(N.NUM)
AND MOD(N.NUM, E.NUM) = 0
)
;
결과
반응형
'SQL' 카테고리의 다른 글
[프로그래머스] SQL 고득점 Kit : JOIN 풀이 (Oracle) (0) | 2021.03.31 |
---|---|
[HackerRank] Binary Tree Nodes 풀이 (Oracle) (0) | 2021.03.16 |
[HackerRank] Weather Observation Station 20 풀이 (Oracle) (0) | 2021.03.15 |
[HackerRank] Interviews 풀이 (Oracle) (0) | 2021.03.10 |
[HackerRank] Occupations 풀이 (Oracle) (0) | 2021.03.08 |
[HackerRank] 15 Days of Learning SQL 풀이 (Oracle) (0) | 2021.02.27 |
[HackerRank] Weather Observation Station 5 풀이 (Oracle) (0) | 2021.02.26 |
댓글