심심풀이 문제 0 3 114

by 창조의날개 [SQL Query] [2018.09.14 16:44:41]


 

심심하신분을 위한 문제 입니다.

안 심심하시면 안풀어도 됩니다.. ^^

 

숫자 0,1,2,3,4,5만 사용하여 3자리 숫자를 만듭니다.

이렇게 만든 3자리 숫자중 3의 배수만 구하는 쿼리를 만들어보세요.

단, 한번 사용한 숫자는 다시 사용 할 수 없습니다.(예, 300, 555)

 

그럼 가능한 숫자는 모두 몇개일까요?

by jkson [2018.09.14 19:09:17]
--울적한 금요일 야근하다가 심심해서.. 뭔가 획기적인 방법이 있을 것 같은데..

--무대뽀.. 0~5로 이루어진 서로 다른 3자리조합 만들고 3의 배수 필터
with t as
(
select to_char(rownum - 1) no 
from dual 
connect by level <= 6
)
select a.no||b.no||c.no c_str 
from t a,t b, t c 
where a.no != b.no and a.no != c.no and b.no != c.no
and mod(to_number(a.no||b.no||c.no),3) = 0
order by 1

--0~5로 만들수 있는 숫자에서 6~9가 들어간 숫자 필터 후
--동일 숫자가 반복되는 숫자 필터 후
--3의 배수 필터
with t as
(
select lpad(rownum,3,'0') no 
from dual 
connect by level <= 543
)
select * 
from t
where not regexp_like(no,'6|7|8|9')
and not regexp_like(no,'(.).*(\1)')
and mod(no,3) = 0
order by 1

 


by 우리집아찌 [2018.09.17 09:49:12]
-- jkson이 다해버려서.. 딴 방식으로
-- 003은 배수인지 불분명

WITH T AS (
    SELECT LEVEL - 1 NUM FROM DUAL CONNECT BY LEVEL <= 6
), T2 AS (
SELECT A.NUM || B.NUM || C.NUM AS NUM  
  FROM T A 
     , T B 
     , T C
)

    SELECT A.NUM
      FROM T2 A
        , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 3 ) B
     WHERE MOD(TO_NUMBER(A.NUM),3) = 0 
     GROUP BY NUM
    HAVING COUNT(DISTINCT SUBSTR(A.NUM , LV , 1 ) ) = 3

 


by 마농 [2018.09.17 11:36:28]
SELECT *
  FROM (SELECT TO_NUMBER(REPLACE(SYS_CONNECT_BY_PATH(v, '-'), '-')) x
          FROM (SELECT LEVEL - 1 v FROM dual CONNECT BY LEVEL <= 6)
         WHERE LEVEL = 3
         START WITH v != 0
         CONNECT BY NOCYCLE PRIOR v != v
           AND LEVEL <= 3
        )
 WHERE MOD(x, 3) = 0
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입