https://www.hackerrank.com/challenges/print-prime-numbers/problem
Write a query to print all prime numbers less than or equal to 1000. Print your result on a single line, and use the ampersand (&) character as your separator (instead of a space).
For example, the output for all prime numbers <=10 would be:
2&3&5&7
with prime as
(
select level+1 num
from dual
connect by level<1000
)
select listagg(num,'&') within group(order by num)
from prime
where not exists( select 1 from prime b
where prime.num!=b.num
and mod(prime.num, b.num)=0);
처음에는 pl/sql로 할려고 했는데, 생각한 대로 출력이 되지 않았다.
그냥 출력이 안됐다..
먼저 with절
에 대해서 알아보았다.
with prime as
(
select level+1 num
from dual
connect by level<1000
)
해당 테이블은 결국 2부터 1000까지를 출력하는 것이다.
위의 임시 테이블을 이용해서 쿼리문을 작성한다.
listagg
절을 사용했는데, 이것은 여러 행의 컬럼을 하나의 행으로 합치는 것이다.
where not exists( select 1 from prime b
where prime.num!=b.num
and mod(prime.num, b.num)=0);
그리고 prime b
는 java할때로 치면 소수인지 아닌지 판별하기 위해서 2부터 점점 num까지 늘려가는 그 변수라고 생각하면 된다.
만약 prime.num%b.num이면 소수가 아니게 된다. 예를 들어 6%3은 0이므로 6은 소수가 아니다.
그리고, 자기자신과 소수는 나눠질 수 있으므로 같지 않을때를 조건으로 주었다.
그리고 위에 해당하는 것들에 포함 안된 것들이 바로 진짜 소수이다.