Study/class note

문제8. SQL / 마름모 출력하기

chanzae 2021. 12. 3. 14:17

[코드를 쓴 상황]

SQL로 다음과 같이 마름모를 출력하시오

 

 

[내가 쓴 코드]

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

with star1 as (select level as num1
                from dual
                connect by level <= &p_num1),
     star2 as (select level as num2
                from dual
                connect by level <= &p_num1 - 1
                order by num2 desc)           
select lpad(' ',&p_num1 - num1,' ')||lpad('★', num1 , '★')  as 마름모
 from star1
union all
select lpad(' ',&p_num1- num2,' ')||lpad('★', num2, '★') 
 from star2;

with절의 임시테이블을 2개 만든 뒤, 하나의 테이블에는 order by절을 이용하여 숫자를 역순으로 나올게 출력한다.

union all 위에 출력되는 쿼리는 삼각형, 아래에 출력되는 쿼리를 역삼각형이다. 삼각형과 역삼각형에 사용한 함수는 동일하나, with절의 임시테이블 star2에서 order by num2 desc를 사용했기 때문에 숫자가 역으로 출력되어 역삼각형이 출력된다.

 

 

[다른 사람이 쓴 코드]

-- 다른 사람이 쓴 코드1
accept p_num prompt '숫자를 입력하세요 : '

with num_table1 as ( select level as num1
                        from dual
                        connect by level <= &p_num ),
     num_table2 as ( select level as num2
                        from dual
                        connect by level <= &p_num-1 )
select lpad(' ',&p_num-num1) || lpad('★',num1,'★') 마름모
    from num_table1
union all
select lpad(' ',num2) || lpad('★',&p_num-num2,'★') 마름모
    from num_table2;

with절의 임시테이블에서 order by절을 사용하지 않고 union all 아래의 역삼각형 쿼리를 다르게 작성하였음. lpad(' ',num2) || lpad('★',&p_num-num2,'★') = 역삼각형 나오는 코드를 따로 작성함.

 

-- 다른 사람이 쓴 코드2
accept p_num1 prompt '숫자를 입력하세요~'

with star1 as (select level as num1
                from dual
                connect by level <= &p_num1)
select lpad(' ',&p_num1 - num1,' ')||lpad('★', num1, '★')  as 마름모
 from star1
union all
select * from (with star1 as (select level as num1
                                from dual
                                connect by level <= &p_num1-1)
               select lpad(' ',&p_num1 - num1,' ')||lpad('★', num1, '★') 
                from star1
                order by 1 desc);

with절의 임시테이블을 한개만 만들고 서브쿼리를 이용해 with절을 2번 사용함.

 

 

[유의사항]

1. 공백(' ')과 별(★)의 바이트(Byte)값이 다름. 공백은 1바이트, 별은 3바이트이기 때문에 삼각형이 만들어질 수 있는 코드임. 만약 별이 아닌 다른 문자를 입력했다면 삼각형이 아닌 사각형이 출력될 수 있음. 

2. 마름모 출력의 관건은 아래 역삼각형 부분을 어떻게 출력할 것인가임. 입력된 숫자를 역으로 출력시키도록 만들거나 공백값의 함수를 바꾸어 출력시키도록 해야함.

 

반응형