본문 바로가기

Study/class note

sql / 알고리즘문제2

113 SQL로 알고리즘 문제 풀기 3(직각삼각형 출력)

-- 숫자를 1부터 8까지 출력하시오
select level as num
 from dual
 connect by level <= 8 ;


예제. 위의 결과를 temp table로 구성할 수 있도록 with절로 생성해서 출력하시오

with star as (select level as num
                from dual
                connect by level <= 8 )
select num
 from star;

예제. 위의 출력되고 있는 숫자 대신에 그 숫자만큼의 ★을 채워넣으시오

select ename, lpad(sal, 10, '*') from emp;
-- 월급을 출력하는데 전체 10자리 잡고 월급을 출력하고 나머지 왼쪽 공간에 *을 채워넣어라.

with star as (select level as num
                from dual
                connect by level <= 8 )
select lpad('★', num, '★')
 from star;
 -- ★을 출력하는데 num의 자리만큼 잡고 ★을 채워넣어라.

문제620. 숫자를 물어보게 하고 숫자를 입력하면 해당 숫자만큼 ★이 그려지게 하시오

숫자를 입력하세요 : 5

★★

★★★

★★★★

★★★★★

accept p_num prompt '숫자를 입력하세요~'

with star as (select level as num1
                from dual
                connect by level <= &p_num )
select lpad('★', num1, '★')
 from star;

accept p_num prompt '숫자를 입력하세요~' 

= p_num이라는 변수에 받아들여라(accept). '숫자를~ '이라는 메세지를 야기(prompt)시켜서 받은 데이터를 p_num에 넣어라.

connect by level <= &p_num 

= p_num 변수 앞에 앤퍼센트(&)를 반드시 붙여줘야 함 = 치환변수

 

문제621. 다음과 같이 결과가 출력될 수 잇도록 코드를 작성하시오

숫자를 입력하세요 ~ : 5

★★★★★

★★★★

★★★

★★

accept p_num prompt '숫자를 입력하세요~'

with star as (select level as num1
                from dual
                connect by level <= &p_num )
select lpad('★', num1, '★')
 from star
 order by num1 desc;

 

 

114 SQL로 알고리즘 문제 풀기 4(삼각형 출력)

      ★

     ★★

    ★★★

   ★★★★

with star as (select level as num1
                from dual
                connect by level <= 8 )
select lpad(' ',10 - num1,' ')||lpad('★', num1, '★') 
 from star;

문제622. 이번에는 다음과 같이 숫자를 물어보게 하고 삼각형이 거꾸로 출력되게 하시오.

숫자를 입력하세요 ~ 5

   ★★★★

    ★★★

     ★★

      ★

accept p_num prompt '숫자를 입력하세요~'

with star as (select level as num1
                from dual
                connect by level <= &p_num )
select lpad(' ',10 - num1,' ')||lpad('★', num1, '★') 
 from star
 order by num1 desc;

참고) *로 넣을경우 삼각형이 만들어지지 않음. *은 1바이트인데 ★은 3바이트여서 차지하는 공간의 크기가 다르므로 출력되는 모양이 달라짐. length는 철자의 갯수를 세는 함수인 반면에 lengthb는 글자의 바이트수를 출력하는 함수. 바이트(byte)는 컴퓨터에 차지하는 공간의 최소 단위.

 

 

115 SQL로 알고리즘 문제 풀기 5(마름모 출력)

마름모 출력은 위의 삼각혐으로 출력하는 쿼리문과 역삼각형으로 출력하는 쿼리문을 union all로 위아래로 구성하면 출력이 되어짐.

-- 내가 쓴 코드
with star1 as (select level as num1
                from dual
                connect by level <= 5),
     star2 as (select level as num2
                from dual
                connect by level <= 4
                order by num2 desc)           
select lpad(' ',5 - num1,' ')||lpad('★', num1, '★') 
 from star1
union all
select lpad(' ',5- num2,' ')||lpad('★', num2, '★') 
 from star2;

 

 

116 SQL로 알고리즘 문제 풀기 6(사각형 출력)

with loop_table as (select level as num1
                from dual
                connect by level <= 5)
select lpad('★', 5, '★')
 from loop_table;

문제623. 위의 SQL을 수정해서 아래와 같이 가로숫자, 세로숫자를 물어보게 하고 결과가 출력되게 하시오

가로 숫자를 입력하세요 ~ 5

세로 숫자를 입력하세요 ~ 4

★★★★★

★★★★★

★★★★★

★★★★★

accept p_num1  prompt '가로 숫자를 입력하세요~'
accept p_num2 prompt '세로 숫자를 입력하세요~'

with loop_table as (select level as num1
                from dual
                connect by level <= &p_num2)
select lpad('★', &p_num1, '★')
 from loop_table;

 

 

117 SQL로 알고리즘 문제 풀기 7(1부터 10까지 숫자의 합)

select sum(level) as num1
 from dual
 connect by level <= 10;

 


118 SQL로 알고리즘 문제 풀기 8(1부터 10까지 숫자의 곱)

select exp(sum(ln(level)))
 from dual
 connect by level <= 10;

문제624. 아래의 결과를 출력하시오

1,2,3,4,5,6,7,8,9,10

select listagg(level,',') as num1
 from dual
connect by level <= 10;

문제625. 아래의 결과를 출력하시오

1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10

select listagg(level,' x ') as num1
 from dual
connect by level <= 10;

문제626. 아래와 같이 출력되게 하시오

1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 = 3628800

select listagg(level,' x ') || ' = ' ||round(exp(sum(ln(level)))) 
 from dual
connect by level <= 10;

3628800.00000000000000000000000000000011 값이 출력되는 이유

> 부동소수점 오류라고 해서 아직가지 컴퓨터로 해결할 수 없는 난제

 

문제627. (점심시간 문제) 아래와 같이 출력하시오

2 x 4 x 6 x 8 x 10 = 3840

select listagg(level,' x ') || ' = ' ||round(exp(sum(ln(level)))) 
 from dual
 where mod(level,2) = 0
 connect by level <= 10;

 

 

119 SQL로 알고리즘 문제 풀기 9(1부터 10까지 짝수만 출력)

select listagg(level,',') 
 from dual
 where mod(level,2) = 0
 connect by level <= 10;

 

 

120 SQL로 알고리즘 문제 풀기 10(1부터 10까지 소수만 출력)

소수 : 1과 자기 자신외의 약수를 가지지 않는 1보다 큰 자연수

예제. 1부터 10 사이의 소수는?

2,3,5,7

-- 서브쿼리 사용
with loop_table as ( select level as num1
                  from dual
                   connect by level <= 10)
select num2
 from (
        select a1.num1 as num2, count(*) as cnt
         from loop_table a1, loop_table a2
         where mod(a1.num1, a2.num1) = 0
         group by a1.num1
        )
 where cnt = 2;
 
 
 -- having 절 사용
 with loop_table as ( select level as num1
                  from dual
                   connect by level <= 10)
 select a1.num1, count(*) 
  from loop_table a1, loop_table a2
  where mod(a1.num1, a2.num1) = 0
  group by a1.num1
  having count(*) = 2;

문제628. 숫자7이 소수인지 아닌지를 출력하시오

select sum(decode(mod(7, level),0,1))
 from dual
 connect by level <= 7;

이 쿼리의 값이 2가 출력되어야 소수

 

문제629. 숫자를 물어보게 하고 숫자를 입력하면 그 숫자가 소수이면 '소수입니다'가 출력되게 하고 소수가 아니면 '소수가 아닙니다'라고 출력되게 하시오.

accept p_num1 prompt '숫자를 입력하세요~'

select case when sum(decode(mod(&p_num1, level),0,1)) =2 then '소수입니다.'
            else '소수가 아닙니다.' end as 소수감별기
 from dual
 connect by level <= &p_num1;

 


121 SQL로 알고리즘 문제 풀기 11(최대 공약수)

약수? 어떤 수나 식을 나누어 나머지가 없이 떨어지는 수나 식을 일컫는 말

-- 16과 24의 최대공약수는?
with num_table as ( select 16 as num1, 24 as num2
                  from dual )
select max(level)
 from num_table
 where mod(num1,level) = 0
    and mod(num2,level) = 0
    connect by level <= num2;
    
    
-- 내가 쓴 코드
with loop_table as ( select level as num1
                  from dual
                   connect by level <= 24)
 select max(num1)
  from loop_table 
  where mod(16,num1) = 0 and mod(24,num1) = 0 ;

문제630. 위의 SQL을 이용해서 다음과 같이 최대공약수를 구하시오.

첫번째 숫자를 입력하세요 ~ 16

두번째 숫자를 입력하세요 ~ 24

최대공약수는 8 입니다.

accept p_num1 prompt '첫번째 숫자를 입력하세요~'
accept p_num2 prompt '두번째 숫자를 입력하세요~'

with num_table as ( select &p_num1 as num1, &p_num2 as num2
                      from dual )
select '최대공약수는 ' || max(level) || ' 입니다.' as 최대공약수
 from num_table
 where mod(num1, level) = 0 
    and mod(num2, level) = 0
    connect by level <= num2;

 

 

122 SQL로 알고리즘 문제 풀기 12(최소 공배수)

-- 16과 24의 최소공배수를 출력하시오
accept p_num1 prompt '첫번째 숫자를 입력하세요~'
accept p_num2 prompt '두번째 숫자를 입력하세요~'

with num_table as ( select &p_num1 as num1, &p_num2 as num2
                      from dual )
select max(level) * &p_num1/max(level) *  &p_num2/max(level)
 from num_table
 where mod(num1, level) = 0 
    and mod(num2, level) = 0
    connect by level <= num2;
    

-- 다른 방법1
with num_table as ( select &p_num1 as num1, &p_num2 as num2
                      from dual )
select (&p_num1 * &p_num2) / max(level)
 from num_table
 where mod(num1, level) = 0 
    and mod(num2, level) = 0
    connect by level <= num2;

 

 

123 SQL로 알고리즘 문제 풀기 13(피타고라스의 정리)

예제. 2의 3승을 출력하시오

select power(2,3)
 from dual;

power 지수함수

 

문제631. 아래의 수학식을 SQL로 구현하시오 !

select power(2,2) + power(3,2)
 from dual;

문제632. 피타고라스의 정리로 직각삼각형의 여부를 다음과 같이 출력되게하시오

밑변의 길이를 입력하세요~ 3

높이를 입력하세요~ 4

빗변의 길이를 입력하세요~ 5

직각삼각형이 맞습니다. or 직각삼각형이 아닙니다.

accept p_num1 prompt '밑변의 길이를 입력하세요~'
accept p_num2 prompt '높이를 입력하세요~'
accept p_num3 prompt '빗변의 길이를 입력하세요~'

select case when power(&p_num1,2) + power(&p_num2,2) = power(&p_num3,2) then '직각삼각형이 맞습니다.'
              else '직각 삼각형이 아닙니다.' end 직각삼각형
 from dual;

 

 

124 SQL로 알고리즘 문제 풀기 14(몬테카를로 알고리즘)

몬테가를로 알고리즘? 수많은 노가다를 통해서 답을 알아내는 것

컴퓨터를 이용하면 2만번이든 3만번이든 수십만번이든 게임을 반복할 수 있고 정답을 알아내기 위해서 여러번 시도를 할 수 있음.

몬테카를로 알고리즘을 이용해서 원주율을 구해보기!

예제. 0~1 사이의 숫자를 램덤으로 생성하시오

select dbms_random.value(0,1)
 from dual;

예제. x좌표를 위한 난수 한개와 y좌표를 위한 난수 한개를 생성하시오

select dbms_random.value(0,1) as x,
       dbms_random.value(0,1) as y
 from dual;

예제. 위의 x,y를 100개 생성하시오

select dbms_random.value(0,1) as x,
       dbms_random.value(0,1) as y
 from dual
 connect by level <= 100;

예제. 아래의 랜덤으로 생성한 빨간점의 갯수 100개 중에 부채꼴 안에 들어가는 빨간점의 개수는 몇개인가요?

with pi as (select dbms_random.value(0,1) as x,
                   dbms_random.value(0,1) as y
              from dual
              connect by level <= 100)
 select count(*)
 from pi
 where power(x,2) + power(y,2) <= 1 ;

 

문제632. 몬테카를로 알고리즘으로 원주율의 근삿값을 구하시오

select count(*) * 4 / 10000 as 파이
 from (select dbms_random.value(0,1) as x,
                   dbms_random.value(0,1) as y
              from dual
              connect by level <= 10000)
 where power(x,2) + power(y,2) <= 1 ;

 

 

125 SQL로 알고리즘 문제 풀기 15(오일러 상수 자연상수 구하기)

오일러의 자연상수 값 구하기

select max(power(1+(1/num1),num1))
 from (select level as num1
         from dual
         connect by level <= 10000);
반응형