[퀴즈] 개미수열 0 10 22,499

by 마농 개미수열 [2014.08.26 17:28:38]



1
11
12
1121
122111
112213
12221131
1123123111
12213111213113
다음엔 어떤 숫자가 올까요?


일전(2008년1월)에 퀴즈게시판에 올라왔던 문제였죠.
http://www.gurubee.net/article/15844
이 문제는 베르나르베르베르의 소설 [개미]에서 소개된 수열로
일명 [개미수열]이라고 합니다.
당시 제가 이걸 프로시져로 구현한 적이 있었는데요.
http://www.gurubee.net/article/15916
문득 SQL 로는 구현할수 없을까? 라는 고민을 하게 되었습니다.


퀴즈입니다.
개미수열을 출력하는 SQL 을 작성하시오.

 

 

[정답] <=== 트리플 클릭

WITH t(n, v, x) AS
(
SELECT 1 n
     , CAST('1' AS VARCHAR2(100)) v
     , CAST(''  AS VARCHAR2(100)) x
  FROM dual
 UNION ALL
SELECT NVL2(x, n, n+1) n
     , NVL2(x, v||SUBSTR(x, 1, 1)||LENGTH(REGEXP_SUBSTR(x, '^(.)(\1)*'))
             ,    SUBSTR(v, 1, 1)||LENGTH(REGEXP_SUBSTR(v, '^(.)(\1)*'))
             ) v
     , REGEXP_REPLACE(NVL(x, v), '^(.)(\1)*') x
  FROM t
 WHERE NVL2(x, n, n+1) <= 10
)
SELECT n, v
  FROM t
 WHERE x IS NULL
;

 

by 아발란체 [2014.08.28 08:56:17]

이제 이해한, 원리는 정말롱 간단하네요. ㅡ_ㅡ)ㆀ

근데 답이 올라왔군요. ㅠ_ㅠ)ㆀ


by 우리집아찌 [2014.08.28 09:42:08]

시간날때 봐야지... 암것도 모르겠음..


by 아발란체 [2014.08.28 10:15:07]

아 정답은,

11221131132111311231

 


by jkson [2014.08.29 14:31:19]

마농님 IQ는 한 150 되나요?;;


by 문두 [2014.09.04 14:30:17]

with t(rn, col) as 

(

select 1 as rn, '1' as col from dual union all

Select rn+1 as rn

         , ( select listagg(max(substr(col,rnum,1))||count(*) within group(order by min(rnum)

              From dual

                      , (select level as rnum from dual connect by level <= 10000)

             Where rnum <= length(col)

             Group by regexp_instr(col, '[^'||substr(col,rnum,1)||']',rnum)

             )

  From t

Where rn <10

)

Select * from t


by 문두 [2014.09.04 14:31:13]

태블릿으로느라 힘들었네요 ㅜㅜ


by 마농 [2014.09.04 14:54:45]

오오! 모바일로 올리느라 고생 많으셧습니다.

옮기는 과정에서 괄호가 두개 빠졌네요.

listagg(max(substr(col,rnum,1))||count(*) ) within group(order by min(rnum) )


by 문두 [2014.09.04 14:58:57]

그렇군요~ㅎㅎ 재밌는문제네용~


by 중공오초 [2015.09.25 09:40:45]

가끔 접속해서 봅니다. 정말 재미있습니다.


by 기본충실 [2018.01.23 17:44:54]

어렵네용....SQL로 수열을 짜시다니;;;ㅋㅋㅋㅋ

대부분 프로시져면 FOR문이나 이런게안들어가나요;;?

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