본문 바로가기

Oracle/SQL

SQL 알고리즘 (삼각형, 마름모, 사각형 구현하기)

WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                     FROM DUAL
                     CONNECT BY LEVEL <=8)
SELECT LPAD( '★', NUM1 , '*' )
FROM LEVEL_TABLE;

 

p_num : 호스트 변수 또는 외부 변수이다. 

문제 숫자를 물어보고, 숫자를 대답하면 해당 숫자만큼 ★이 그려지도록 출력

ACCEPT P_NUM PROMPT '숫자를 입력하세요.'

WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                     FROM DUAL
                     CONNECT BY LEVEL <= &P_NUM)
SELECT LPAD( '★', NUM1 , '*' )
FROM LEVEL_TABLE;

ACEEPT :받아들여라~
P_NUM : 변수를 PROMPT : 내용을 띄우세요 ('숫자를입력하세요')=야기시키다
→ PROMPT 창이뜨면서 숫자를 입력하려고 뜨면 그 숫자를 입력한다.,
그 숫자가 WITH 절로 가 &P_NUM 으로 가게된다.
&P_NUM : 치환변수

직각삼각형을 거꾸로 출력

ACCEPT P_NUM PROMPT '숫자를입력하세요.'

WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                     FROM DUAL
                     CONNECT BY LEVEL <= &P_NUM
                    )
SELECT LPAD( '★', NUM1 , '*' )
FROM LEVEL_TABLE
 ORDER BY 1 DESC;

-> ORDER BY 절을 입력하여 출력 되는 별의 갯수가 높은 것 부터 출력 되면 거꾸로 출력 된다. 

622 삼각형 출력

ACCEPT P_NUM PROMPT '숫자를입력하세요.'

WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                     FROM DUAL
                     CONNECT BY LEVEL <= &P_NUM
                    )
SELECT LPAD(' ',10 - NUM1 ,' ')||LPAD( '★', NUM1 , '★' ) 
FROM LEVEL_TABLE;

해석 : 공백을 채워준다. 삼각형이므로 첫번째 출력 되는 행부터 공백이 많아야 하므로 10 - NUM1 을 하는 식을 넣어준다.

623 삼각형을 거꾸로 출력

ACCEPT P_NUM PROMPT '숫자를입력하세요.'

WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                     FROM DUAL
                     CONNECT BY LEVEL <= &P_NUM
                    )
SELECT LPAD(' ',10 - NUM1 ,' ')||LPAD( '★', NUM1 , '★' ) 
FROM LEVEL_TABLE
ORDER BY 1 DESC;

★ 으로 해야 삼각형 모양이 제대로 출력된다. * 는 1 바이트 이기때문에 삼각형 모양이 출력 되지 않는다. 
★ 는 3바이트 이다. 

BYTE 를 확인하는 함수 (글자의 바이트 수 출력)
바이트 = 컴퓨터에차지하는 공간의최소단위

SELECT LENGTHB('*'), LENGTHB('★')
FROM DUAL;

 


624 마름모 출력

삼각형과, 역삼각형을 UNION ALL 로 묶어서 출력 되어 진다. → 위에 출력한 내용들로

ACCEPT P_NUM PROMPT '숫자를 입력하세요'

WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                     FROM DUAL
                     CONNECT BY LEVEL <= &P_NUM
                     ),
     LEVEL_TABLE2 AS (SELECT LEVEL AS NUM2
                       FROM DUAL
                       CONNECT BY LEVEL <= &P_NUM-1
                      )
SELECT LPAD(' ',&P_NUM-NUM1 ,' ')||LPAD( '★', NUM1 , '★' ) 
FROM LEVEL_TABLE

UNION ALL

SELECT  LPAD(' ', NUM2) || LPAD ('★', &P_NUM -NUM2 , '★')
FROM LEVEL_TABLE2;

또는

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;

또는

WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                     FROM DUAL
                     CONNECT BY LEVEL <= 5
                    )
SELECT LPAD(' ',10-NUM1 ,' ')||LPAD( '★', NUM1 , '★' ) 
FROM LEVEL_TABLE

UNION ALL

SELECT * 
FROM (WITH LEVEL_TABLE AS (SELECT LEVEL AS NUM1
                            FROM DUAL
                            CONNECT BY LEVEL <= 5-1
                             )
      SELECT LPAD(' ',10-NUM1 ,' ')||LPAD( '★', NUM1 , '★' ) 
      FROM LEVEL_TABLE
      ORDER BY 1 DESC);

UNION ALL 은 WITH 절을 두개로 쓸수 없기 때문에 FROM 절의 SUB쿼리 안으로 넣어서 문제를 풀 수 있다.
→ 공백을 LPAD(' ', NUM2) NUM2 만큼 채워 넣는다.
→ LPAD ('★', &P_NUM -NUM2 , '★') 은★을 &P_NUM -NUM2 갯수만큼 채워 넣는것이다. 

정사각형출력

accept p_num prompt '숫자를 입력하세요.'
with num_table as ( select level as num
                        from dual
                        connect by level <=&p_num )

SELECT LPAD('★',&P_NUM,'★')AS "사각형"
FROM NUM_TABLE;

직각사각형출력

ACCEPT P_NUM PROMPT '가로숫자입력'
ACCEPT P_NUM2 PROMPT '세로숫자입력'

WITH NUM_TABLE1 AS (SELECT LEVEL AS NUM1
                    FROM DUAL 
                    CONNECT BY LEVEL <= &P_NUM2)
SELECT RPAD('★',&P_NUM,'★') AS 직각사각형
FROM NUM_TABLE1;