SQL/초심자를 위한 데이터베이스 및 빅데이터 플랫폼 구축과정(SQL, 하둡)

[easyupclass] 초심자를 위한 데이터베이스 및 빅데이터 플랫폼 구축과정(SQL, 하둡) 23 - 25

김초송 2022. 11. 27. 17:47

SQL로 알고리즘 문제 풀기

-- 1. 직각 삼각형 만들기 (+ union all 하면 마름모)
select lpad('*', level, '*')
from dual
connect by level <= 8;

-- 7. 1부터 10까지 합
select sum(level)
from dual
connect by level <= 10;

-- 9. 1부터 10까지 짝수만 한 행에(가로로) 출력
-- listagg 활용
select listagg(level, ', ') 짝수
from dual
where mod(level,2)=0
connect by level <= 10;

-- 10. 1부터 10까지 소수만 출력
WITH loop_table as (
select level as num
from dual
connect by level <=10
)

select l1.num as num1
from loop_table l1, loop_table l2
where mod(l1.num, l2.num) = 0
group by l1.num
having count(l1.num)=2;

-- 11. 최대공약수 구하기
ACCEPT p_n1 prompt '첫번째 숫자 : '
ACCEPT p_n2 prompt '두번째 숫자 : '

with num_d as (
select &p_n1 as num1, &p_n2 as num2
from dual
)
select max(level) as 최대공약수
from num_d
where mod(num1, level) = 0 and mod(num2, level)=0
connect by level <= num2 ;

-- 12. 최소공배수 구하기
ACCEPT p_n1 prompt '첫번째 숫자 : '
ACCEPT p_n2 prompt '두번째 숫자 : '
with num_d as (
select &p_n1 as num1, &p_n2 as num2
from dual
)
select (num1/max(level))*(num2/max(level))*max(level) as 최소공배수
from num_d
where mod(num1, level)=0 and mod(num2, level)=0
connect by level <= num2 ;

-- 13. 직각삼각형 여부 확인하기
-- power(2,3): 2의 3제곱
ACCEPT num1 prompt '밑변 : '
ACCEPT num2 prompt '높이 : '
ACCEPT num3 prompt '빗변 : '
select case 
		when (power(&num1, 2) + power(&num2, 2)) = power(&num3, 2)
        	then '직각삼각형'
            else '직각삼각형 아님'
       end as 피타고라스 정리
from dual;

-- 14. 몬테카를로 알고리즘으로 원주율 알아내기
-- DBMS_RANDOM.value(0,1) : 0에서 1 사이 난수 출력
select sum(case 
			when ( power(num1, 2) + power(num2, 2) ) <= 1
            	then 1 else 0 -- 1이면 부채꼴 안에 들어간 점
           end ) / 1000000 * 4 as 원주율
from ( select DBMS_RANDOM.value(0,1) as num1
			, DBMS_RANDOM.value(0,1) as num2
       from dual
       connect by level < 1000000 -- 난수 100만 개 생성
     ) ;
     
-- 15. 몬테카를로 알고리즘으로 자연상수 e의 값 알아내기
with loop_table as (
select level as p
from dual
connect by level <= 1000000
)
select result
from ( select n, power((1+1/n), n) as result
	   from loop_table)
where n=1000000;