database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40755 게시물 읽기
No. 40755
쿼리 퀴즈입니다.(시계맞추기)
작성자
김흥수(protokhs)
작성일
2015-03-30 09:56ⓒ
2015-03-31 14:12ⓜ
조회수
9,692

 알고리즘 퀴즈에서 가져온 문제입니다.

아래의 문제를 오라클 SQL로 해결하는데..

시간 제약과 메모리 제약은 무시하시고 답만 나오면 됩니다.

그림과 같이 4 x 4 개의 격자 형태로 배치된 16개의 시계가 있다. 이 시계들은 모두 12시, 3시, 6시, 혹은 9시를 가리키고 있다. 이 시계들이 모두 12시를 가리키도록 바꾸고 싶다.

 

 

시계의 시간을 조작하는 유일한 방법은 모두 10개 있는 스위치들을 조작하는 것으로, 각 스위치들은 모두 적게는 3개에서 많게는 5개의 시계에 연결되어 있다. 한 스위치를 누를 때마다, 해당 스위치와 연결된 시계들의 시간은 3시간씩 앞으로 움직인다. 스위치들과 그들이 연결된 시계들의 목록은 다음과 같다.

0 0, 1, 2
1 3, 7, 9, 11
2 4, 10, 14, 15
3 0, 4, 5, 6, 7
4 6, 7, 8, 10, 12
5 0, 2, 14, 15
6 3, 14, 15
7 4, 5, 7, 14, 15
8 1, 2, 3, 4, 5
9 3, 4, 5, 9, 13

시계들은 맨 윗줄부터, 왼쪽에서 오른쪽으로 순서대로 번호가 매겨졌다고 가정하자. 시계들이 현재 가리키는 시간들이 주어졌을 때, 모든 시계를 12시로 돌리기 위해 최소한 눌러야 할 스위치의 수를 계산하는 프로그램을 작성하시오.

 

입력

 

첫 줄에 테스트 케이스의 개수 C (<= 30) 가 주어진다. 
각 테스트 케이스는 한 줄에 16개의 정수로 주어지며, 각 정수는 0번부터 15번까지 각 시계가 가리키고 있는 시간을 12, 3, 6, 9 중 하나로 표현한다.

 

출력

 

각 테스트 케이스당 한 줄을 출력한다. 시계들을 모두 12시로 돌려놓기 위해 눌러야 할 스위치의 최소 수를 출력한다. 만약 이것이 불가능할 경우 -1 을 출력한다.

 

예제 입력

2
12 6 6 6 6 6 12 12 12 12 12 12 12 12 12 12 
12 9 3 12 6 6 9 3 12 9 12 9 12 12 6 6

예제 출력

2
9

 

 

 

편의를 위해

 

with 초기시계상태 as (

    select 12 c0 , 9 c1, 3 c2, 12 c3 , 6 c4 , 6 c5 , 9 c6 , 3 c7 , 12 c8 , 9 c9 , 12 c10 , 9 c11 , 12 c12 , 12 c13 , 6 c14 , 6 c15 from dual

 

)

 

원문은 algospot.com/judge/problem/read/CLOCKSYNC

이 글에 대한 댓글이 총 7건 있습니다.

WITH t1 AS
(
SELECT 0 n, '0, 1, 2' v FROM dual
UNION ALL SELECT 1, '3, 7, 9, 11' FROM dual
UNION ALL SELECT 2, '4, 10, 14, 15' FROM dual
UNION ALL SELECT 3, '0, 4, 5, 6, 7' FROM dual
UNION ALL SELECT 4, '6, 7, 8, 10, 12' FROM dual
UNION ALL SELECT 5, '0, 2, 14, 15' FROM dual
UNION ALL SELECT 6, '3, 14, 15' FROM dual
UNION ALL SELECT 7, '4, 5, 7, 14, 15' FROM dual
UNION ALL SELECT 8, '1, 2, 3, 4, 5' FROM dual
UNION ALL SELECT 9, '3, 4, 5, 9, 13' FROM dual
)
, t2(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15) AS
(
-- SELECT 12, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 FROM dual
SELECT 12, 9, 3, 12, 6, 6, 9, 3, 12, 9, 12, 9, 12, 12, 6, 6 FROM dual
)
, t3(lv, n, p, cnt, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15) AS
(
SELECT 1 lv
     , n
     , n || '' p
     , 1 cnt
     , MOD(c0  + CASE WHEN INSTR(' '||v||',', ' '|| 0||',') > 0 THEN 3 ELSE 0 END, 12) c0
     , MOD(c1  + CASE WHEN INSTR(' '||v||',', ' '|| 1||',') > 0 THEN 3 ELSE 0 END, 12) c1
     , MOD(c2  + CASE WHEN INSTR(' '||v||',', ' '|| 2||',') > 0 THEN 3 ELSE 0 END, 12) c2
     , MOD(c3  + CASE WHEN INSTR(' '||v||',', ' '|| 3||',') > 0 THEN 3 ELSE 0 END, 12) c3
     , MOD(c4  + CASE WHEN INSTR(' '||v||',', ' '|| 4||',') > 0 THEN 3 ELSE 0 END, 12) c4
     , MOD(c5  + CASE WHEN INSTR(' '||v||',', ' '|| 5||',') > 0 THEN 3 ELSE 0 END, 12) c5
     , MOD(c6  + CASE WHEN INSTR(' '||v||',', ' '|| 6||',') > 0 THEN 3 ELSE 0 END, 12) c6
     , MOD(c7  + CASE WHEN INSTR(' '||v||',', ' '|| 7||',') > 0 THEN 3 ELSE 0 END, 12) c7
     , MOD(c8  + CASE WHEN INSTR(' '||v||',', ' '|| 8||',') > 0 THEN 3 ELSE 0 END, 12) c8
     , MOD(c9  + CASE WHEN INSTR(' '||v||',', ' '|| 9||',') > 0 THEN 3 ELSE 0 END, 12) c9
     , MOD(c10 + CASE WHEN INSTR(' '||v||',', ' '||10||',') > 0 THEN 3 ELSE 0 END, 12) c10
     , MOD(c11 + CASE WHEN INSTR(' '||v||',', ' '||11||',') > 0 THEN 3 ELSE 0 END, 12) c11
     , MOD(c12 + CASE WHEN INSTR(' '||v||',', ' '||12||',') > 0 THEN 3 ELSE 0 END, 12) c12
     , MOD(c13 + CASE WHEN INSTR(' '||v||',', ' '||13||',') > 0 THEN 3 ELSE 0 END, 12) c13
     , MOD(c14 + CASE WHEN INSTR(' '||v||',', ' '||14||',') > 0 THEN 3 ELSE 0 END, 12) c14
     , MOD(c15 + CASE WHEN INSTR(' '||v||',', ' '||15||',') > 0 THEN 3 ELSE 0 END, 12) c15
  FROM t1, t2
 UNION ALL
SELECT lv + 1 lv
     , t1.n
     , p || '-' || t1.n p
     , DECODE(t1.n, t3.n, cnt + 1, 1) cnt
     , MOD(c0  + CASE WHEN INSTR(' '||v||',', ' '|| 0||',') > 0 THEN 3 ELSE 0 END, 12) c0
     , MOD(c1  + CASE WHEN INSTR(' '||v||',', ' '|| 1||',') > 0 THEN 3 ELSE 0 END, 12) c1
     , MOD(c2  + CASE WHEN INSTR(' '||v||',', ' '|| 2||',') > 0 THEN 3 ELSE 0 END, 12) c2
     , MOD(c3  + CASE WHEN INSTR(' '||v||',', ' '|| 3||',') > 0 THEN 3 ELSE 0 END, 12) c3
     , MOD(c4  + CASE WHEN INSTR(' '||v||',', ' '|| 4||',') > 0 THEN 3 ELSE 0 END, 12) c4
     , MOD(c5  + CASE WHEN INSTR(' '||v||',', ' '|| 5||',') > 0 THEN 3 ELSE 0 END, 12) c5
     , MOD(c6  + CASE WHEN INSTR(' '||v||',', ' '|| 6||',') > 0 THEN 3 ELSE 0 END, 12) c6
     , MOD(c7  + CASE WHEN INSTR(' '||v||',', ' '|| 7||',') > 0 THEN 3 ELSE 0 END, 12) c7
     , MOD(c8  + CASE WHEN INSTR(' '||v||',', ' '|| 8||',') > 0 THEN 3 ELSE 0 END, 12) c8
     , MOD(c9  + CASE WHEN INSTR(' '||v||',', ' '|| 9||',') > 0 THEN 3 ELSE 0 END, 12) c9
     , MOD(c10 + CASE WHEN INSTR(' '||v||',', ' '||10||',') > 0 THEN 3 ELSE 0 END, 12) c10
     , MOD(c11 + CASE WHEN INSTR(' '||v||',', ' '||11||',') > 0 THEN 3 ELSE 0 END, 12) c11
     , MOD(c12 + CASE WHEN INSTR(' '||v||',', ' '||12||',') > 0 THEN 3 ELSE 0 END, 12) c12
     , MOD(c13 + CASE WHEN INSTR(' '||v||',', ' '||13||',') > 0 THEN 3 ELSE 0 END, 12) c13
     , MOD(c14 + CASE WHEN INSTR(' '||v||',', ' '||14||',') > 0 THEN 3 ELSE 0 END, 12) c14
     , MOD(c15 + CASE WHEN INSTR(' '||v||',', ' '||15||',') > 0 THEN 3 ELSE 0 END, 12) c15
  FROM t1, t3
 WHERE t1.n >= t3.n + DECODE(cnt, 3, 1, 0)
   AND 0 != ANY(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15)
)
SELECT lv, p
  FROM t3
 WHERE 0 = ALL(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15)
   AND ROWNUM = 1
;

마농(manon94)님이 2015-03-31 18:23에 작성한 댓글입니다.
이 댓글은 2015-03-31 18:33에 마지막으로 수정되었습니다.

 마농님 훌륭하신 방법인데요...

 

종료조건만 추가하시면 정답일 듯.

 

만약 답이 없다면 마농님의 sql은 무한 루프를 돕니다.

예를 들어 시계의 초기 상태를 c1을 9가 아니라 3 또는 6으로 바꾸어 테스트 하면 무한 루프가 돕니다.

(아 그리고 rownum이 이런식으로 훌륭하게  stop이 걸리는 것을 배우게 되었습니다.)

김흥수(protokhs)님이 2015-04-01 00:05에 작성한 댓글입니다.
이 댓글은 2015-04-01 00:07에 마지막으로 수정되었습니다.

무한루프는 안돌게 한거에요.
시간이 조금 더 걸릴 뿐 결국은 끝납니다.
주신 예제로는 1분 안에는 끝나네요.
일단 모든 조합 가능한 경우의 수를 다 하려고 했더니 너무 오래걸려서
1-2 와 2-1 은 결국 같은 결과를 내기 때문에 2-1은 제거하고 1-2 만 적용했구요.
같은 버튼을 4번 누르면 제자리로 돌아오므로 4번 못누르게 적용했습니다.
다음 2가지 제약사항(계층 전개 조건)을 적용했습니다.
  1. 무조건 낮은 버튼부터 높은 순으로 순차적으로 누르도록
  2. 같은 버튼은 최대 3번만 누르도록
결국 최대 가능 레벨은 모든 버튼을 3번씩 누르면 30레벨까지 가게 되겠네요.
계층구조를 전개하다가 모두 12시가 되는 1건을 만나면 종료하도록 Rownum 조건 줬구요.
모든 경우의 수를 점검하고도 결과가 없을 경우엔 MIN 과 NVL 로 -1 처리 했어요.
처음 시작을 레벨 1이 아닌 0으로 변경하여 쿼리를 간략화 해봤습니다.


WITH t1 AS
(
SELECT 0 n, '0, 1, 2' v               FROM dual
UNION ALL SELECT 1, '3, 7, 9, 11'     FROM dual
UNION ALL SELECT 2, '4, 10, 14, 15'   FROM dual
UNION ALL SELECT 3, '0, 4, 5, 6, 7'   FROM dual
UNION ALL SELECT 4, '6, 7, 8, 10, 12' FROM dual
UNION ALL SELECT 5, '0, 2, 14, 15'    FROM dual
UNION ALL SELECT 6, '3, 14, 15'       FROM dual
UNION ALL SELECT 7, '4, 5, 7, 14, 15' FROM dual
UNION ALL SELECT 8, '1, 2, 3, 4, 5'   FROM dual
UNION ALL SELECT 9, '3, 4, 5, 9, 13'  FROM dual
)
, t2(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15) AS
(
-- SELECT 12, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 FROM dual
-- SELECT 12, 9, 3, 12, 6, 6, 9, 3, 12, 9, 12, 9, 12, 12, 6, 6 FROM dual
 SELECT 12, 3, 3, 12, 6, 6, 9, 3, 12, 9, 12, 9, 12, 12, 6, 6 FROM dual
)
, t3(lv, n, p, cnt, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15) AS
(
SELECT 0 lv
     , -1 n
     , CAST('' AS VARCHAR2(99)) p
     , 3 cnt
     , c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15
  FROM t2
 UNION ALL
SELECT lv + 1 lv
     , t1.n
     , p || '-' || t1.n p
     , DECODE(t1.n, t3.n, cnt + 1, 1) cnt
     , MOD(c0  + CASE WHEN INSTR(' '||v||',', ' '|| 0||',') > 0 THEN 3 ELSE 0 END, 12) c0
     , MOD(c1  + CASE WHEN INSTR(' '||v||',', ' '|| 1||',') > 0 THEN 3 ELSE 0 END, 12) c1
     , MOD(c2  + CASE WHEN INSTR(' '||v||',', ' '|| 2||',') > 0 THEN 3 ELSE 0 END, 12) c2
     , MOD(c3  + CASE WHEN INSTR(' '||v||',', ' '|| 3||',') > 0 THEN 3 ELSE 0 END, 12) c3
     , MOD(c4  + CASE WHEN INSTR(' '||v||',', ' '|| 4||',') > 0 THEN 3 ELSE 0 END, 12) c4
     , MOD(c5  + CASE WHEN INSTR(' '||v||',', ' '|| 5||',') > 0 THEN 3 ELSE 0 END, 12) c5
     , MOD(c6  + CASE WHEN INSTR(' '||v||',', ' '|| 6||',') > 0 THEN 3 ELSE 0 END, 12) c6
     , MOD(c7  + CASE WHEN INSTR(' '||v||',', ' '|| 7||',') > 0 THEN 3 ELSE 0 END, 12) c7
     , MOD(c8  + CASE WHEN INSTR(' '||v||',', ' '|| 8||',') > 0 THEN 3 ELSE 0 END, 12) c8
     , MOD(c9  + CASE WHEN INSTR(' '||v||',', ' '|| 9||',') > 0 THEN 3 ELSE 0 END, 12) c9
     , MOD(c10 + CASE WHEN INSTR(' '||v||',', ' '||10||',') > 0 THEN 3 ELSE 0 END, 12) c10
     , MOD(c11 + CASE WHEN INSTR(' '||v||',', ' '||11||',') > 0 THEN 3 ELSE 0 END, 12) c11
     , MOD(c12 + CASE WHEN INSTR(' '||v||',', ' '||12||',') > 0 THEN 3 ELSE 0 END, 12) c12
     , MOD(c13 + CASE WHEN INSTR(' '||v||',', ' '||13||',') > 0 THEN 3 ELSE 0 END, 12) c13
     , MOD(c14 + CASE WHEN INSTR(' '||v||',', ' '||14||',') > 0 THEN 3 ELSE 0 END, 12) c14
     , MOD(c15 + CASE WHEN INSTR(' '||v||',', ' '||15||',') > 0 THEN 3 ELSE 0 END, 12) c15
  FROM t1, t3
 WHERE t1.n >= t3.n + DECODE(cnt, 3, 1, 0)
   AND 0 != ANY(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15)
)
SELECT NVL(MIN(lv), -1) lv
     , MIN(p) p
  FROM t3
 WHERE 0 = ALL(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15)
   AND ROWNUM = 1
;

마농(manon94)님이 2015-04-01 08:47에 작성한 댓글입니다.
이 댓글은 2015-04-01 09:16에 마지막으로 수정되었습니다.

 아 예..

말씀이 맞네요..

자세히 보니 "DECODE(cnt, 3, 1, 0)" 이부분이 말씀하신 그 부분이네요...

 

제가 잘못 생각했습니다.

훌륭하신 답이십니다.

 

그리고 마농님 질문이 있는데요..

rownum이 stop 먹는 거 recursive-with 안쪽으로 파고 들거라는 것을 미리 알고 하신건가요?

아니면 해보니까 이번에 아시게 된건가요?

김흥수(protokhs)님이 2015-04-01 09:16에 작성한 댓글입니다.

그냥 감으로... ㅎㅎ

마농(manon94)님이 2015-04-01 09:18에 작성한 댓글입니다.

 ㅋㅋ 훌륭!!

김흥수(protokhs)님이 2015-04-01 09:23에 작성한 댓글입니다.

 with 스위치정보 as

(
            select 0 sw, 1 c0 , 1 c1, 1 c2, 0 c3 , 0 c4 , 0 c5 , 0 c6 , 0 c7 , 0 c8 , 0 c9 , 0 c10 , 0 c11 , 0 c12 , 0 c13 , 0 c14 , 0 c15 from dual
union all   select 1 sw, 0 c0 , 0 c1, 0 c2, 1 c3 , 0 c4 , 0 c5 , 0 c6 , 1 c7 , 0 c8 , 1 c9 , 0 c10 , 1 c11 , 0 c12 , 0 c13 , 0 c14 , 0 c15 from dual
union all   select 2 sw, 0 c0 , 0 c1, 0 c2, 0 c3 , 1 c4 , 0 c5 , 0 c6 , 0 c7 , 0 c8 , 0 c9 , 1 c10 , 0 c11 , 0 c12 , 0 c13 , 1 c14 , 1 c15 from dual
union all   select 3 sw, 1 c0 , 0 c1, 0 c2, 0 c3 , 1 c4 , 1 c5 , 1 c6 , 1 c7 , 0 c8 , 0 c9 , 0 c10 , 0 c11 , 0 c12 , 0 c13 , 0 c14 , 0 c15 from dual
union all   select 4 sw, 0 c0 , 0 c1, 0 c2, 0 c3 , 0 c4 , 0 c5 , 1 c6 , 1 c7 , 1 c8 , 0 c9 , 1 c10 , 0 c11 , 1 c12 , 0 c13 , 0 c14 , 0 c15 from dual
union all   select 5 sw, 1 c0 , 0 c1, 1 c2, 0 c3 , 0 c4 , 0 c5 , 0 c6 , 0 c7 , 0 c8 , 0 c9 , 0 c10 , 0 c11 , 0 c12 , 0 c13 , 1 c14 , 1 c15 from dual
union all   select 6 sw, 0 c0 , 0 c1, 0 c2, 1 c3 , 0 c4 , 0 c5 , 0 c6 , 0 c7 , 0 c8 , 0 c9 , 0 c10 , 0 c11 , 0 c12 , 0 c13 , 1 c14 , 1 c15 from dual
union all   select 7 sw, 0 c0 , 0 c1, 0 c2, 0 c3 , 1 c4 , 1 c5 , 0 c6 , 1 c7 , 0 c8 , 0 c9 , 0 c10 , 0 c11 , 0 c12 , 0 c13 , 1 c14 , 1 c15 from dual
union all   select 8 sw, 0 c0 , 1 c1, 1 c2, 1 c3 , 1 c4 , 1 c5 , 0 c6 , 0 c7 , 0 c8 , 0 c9 , 0 c10 , 0 c11 , 0 c12 , 0 c13 , 0 c14 , 0 c15 from dual
union all   select 9 sw, 0 c0 , 0 c1, 0 c2, 1 c3 , 1 c4 , 1 c5 , 0 c6 , 0 c7 , 0 c8 , 1 c9 , 0 c10 , 0 c11 , 0 c12 , 1 c13 , 0 c14 , 0 c15 from dual
)
, 초기시계상태 as
(
    select 12 c0 , 9 c1, 3 c2, 12 c3 , 6 c4 , 6 c5 , 9 c6 , 3 c7 , 12 c8 , 9 c9 , 12 c10 , 9 c11 , 12 c12 , 12 c13 , 6 c14 , 6 c15 from dual
)
, 초기상태단순화 as
(
    select
        mod(a.c0 / 3 , 4 )   c0
        , mod(a.c1  / 3 , 4) c1
        , mod(a.c2  / 3 , 4) c2
        , mod(a.c3  / 3 , 4) c3
        , mod(a.c4  / 3 , 4) c4
        , mod(a.c5  / 3 , 4) c5
        , mod(a.c6  / 3 , 4) c6
        , mod(a.c7  / 3 , 4) c7
        , mod(a.c8  / 3 , 4) c8
        , mod(a.c9  / 3 , 4) c9
        , mod(a.c10 / 3 , 4) c10
        , mod(a.c11 / 3 , 4) c11
        , mod(a.c12 / 3 , 4) c12
        , mod(a.c13 / 3 , 4) c13
        , mod(a.c14 / 3 , 4) c14
        , mod(a.c15 / 3 , 4) c15
    from    초기시계상태 a
)
, 단위스위치상태 as
(
    select
        level - 1 클릭수
    from    dual
    connect by
        level < 5
)
, 스위치상태조합 as
(
    select
        b.sw
        , b.c0
        , b.c1
        , b.c2
        , b.c3
        , b.c4
        , b.c5
        , b.c6
        , b.c7
        , b.c8
        , b.c9
        , b.c10
        , b.c11
        , b.c12
        , b.c13
        , b.c14
        , b.c15
        , a.클릭수
    from    단위스위치상태 a
            , 스위치정보 b
)
, 스위치상태검색 as
(
    select
        스위치0.클릭수 스위치0클릭수
        , 스위치1.클릭수 스위치1클릭수
        , 스위치2.클릭수 스위치2클릭수
        , 스위치3.클릭수 스위치3클릭수
        , 스위치4.클릭수 스위치4클릭수
        , 스위치5.클릭수 스위치5클릭수
        , 스위치6.클릭수 스위치6클릭수
        , 스위치7.클릭수 스위치7클릭수
        , 스위치8.클릭수 스위치8클릭수
        , 스위치9.클릭수 스위치9클릭수
        , mod(a.c0 + 스위치0.c0 * 스위치0.클릭수 + 스위치1.c0 * 스위치1.클릭수 + 스위치2.c0 * 스위치2.클릭수 + 스위치3.c0 * 스위치3.클릭수 + 스위치4.c0 * 스위치4.클릭수 + 스위치5.c0 * 스위치5.클릭수 + 스위치6.c0 * 스위치6.클릭수 + 스위치7.c0 * 스위치7.클릭수 + 스위치8.c0 * 스위치8.클릭수 + 스위치9.c0  * 스위치9.클릭수,4) 시계0상태
        , mod(a.c1 + 스위치0.c1 * 스위치0.클릭수 + 스위치1.c1 * 스위치1.클릭수 + 스위치2.c1 * 스위치2.클릭수 + 스위치3.c1 * 스위치3.클릭수 + 스위치4.c1 * 스위치4.클릭수 + 스위치5.c1 * 스위치5.클릭수 + 스위치6.c1 * 스위치6.클릭수 + 스위치7.c1 * 스위치7.클릭수 + 스위치8.c1 * 스위치8.클릭수 + 스위치9.c1  * 스위치9.클릭수,4) 시계1상태
        , mod(a.c2 + 스위치0.c2 * 스위치0.클릭수 + 스위치1.c2 * 스위치1.클릭수 + 스위치2.c2 * 스위치2.클릭수 + 스위치3.c2 * 스위치3.클릭수 + 스위치4.c2 * 스위치4.클릭수 + 스위치5.c2 * 스위치5.클릭수 + 스위치6.c2 * 스위치6.클릭수 + 스위치7.c2 * 스위치7.클릭수 + 스위치8.c2 * 스위치8.클릭수 + 스위치9.c2  * 스위치9.클릭수,4) 시계2상태
        , mod(a.c3 + 스위치0.c3 * 스위치0.클릭수 + 스위치1.c3 * 스위치1.클릭수 + 스위치2.c3 * 스위치2.클릭수 + 스위치3.c3 * 스위치3.클릭수 + 스위치4.c3 * 스위치4.클릭수 + 스위치5.c3 * 스위치5.클릭수 + 스위치6.c3 * 스위치6.클릭수 + 스위치7.c3 * 스위치7.클릭수 + 스위치8.c3 * 스위치8.클릭수 + 스위치9.c3  * 스위치9.클릭수,4) 시계3상태
        , mod(a.c4 + 스위치0.c4 * 스위치0.클릭수 + 스위치1.c4 * 스위치1.클릭수 + 스위치2.c4 * 스위치2.클릭수 + 스위치3.c4 * 스위치3.클릭수 + 스위치4.c4 * 스위치4.클릭수 + 스위치5.c4 * 스위치5.클릭수 + 스위치6.c4 * 스위치6.클릭수 + 스위치7.c4 * 스위치7.클릭수 + 스위치8.c4 * 스위치8.클릭수 + 스위치9.c4  * 스위치9.클릭수,4) 시계4상태
        , mod(a.c5 + 스위치0.c5 * 스위치0.클릭수 + 스위치1.c5 * 스위치1.클릭수 + 스위치2.c5 * 스위치2.클릭수 + 스위치3.c5 * 스위치3.클릭수 + 스위치4.c5 * 스위치4.클릭수 + 스위치5.c5 * 스위치5.클릭수 + 스위치6.c5 * 스위치6.클릭수 + 스위치7.c5 * 스위치7.클릭수 + 스위치8.c5 * 스위치8.클릭수 + 스위치9.c5  * 스위치9.클릭수,4) 시계5상태
        , mod(a.c6 + 스위치0.c6 * 스위치0.클릭수 + 스위치1.c6 * 스위치1.클릭수 + 스위치2.c6 * 스위치2.클릭수 + 스위치3.c6 * 스위치3.클릭수 + 스위치4.c6 * 스위치4.클릭수 + 스위치5.c6 * 스위치5.클릭수 + 스위치6.c6 * 스위치6.클릭수 + 스위치7.c6 * 스위치7.클릭수 + 스위치8.c6 * 스위치8.클릭수 + 스위치9.c6  * 스위치9.클릭수,4) 시계6상태
        , mod(a.c7 + 스위치0.c7 * 스위치0.클릭수 + 스위치1.c7 * 스위치1.클릭수 + 스위치2.c7 * 스위치2.클릭수 + 스위치3.c7 * 스위치3.클릭수 + 스위치4.c7 * 스위치4.클릭수 + 스위치5.c7 * 스위치5.클릭수 + 스위치6.c7 * 스위치6.클릭수 + 스위치7.c7 * 스위치7.클릭수 + 스위치8.c7 * 스위치8.클릭수 + 스위치9.c7  * 스위치9.클릭수,4) 시계7상태
        , mod(a.c8 + 스위치0.c8 * 스위치0.클릭수 + 스위치1.c8 * 스위치1.클릭수 + 스위치2.c8 * 스위치2.클릭수 + 스위치3.c8 * 스위치3.클릭수 + 스위치4.c8 * 스위치4.클릭수 + 스위치5.c8 * 스위치5.클릭수 + 스위치6.c8 * 스위치6.클릭수 + 스위치7.c8 * 스위치7.클릭수 + 스위치8.c8 * 스위치8.클릭수 + 스위치9.c8  * 스위치9.클릭수,4) 시계8상태
        , mod(a.c9 + 스위치0.c9 * 스위치0.클릭수 + 스위치1.c9 * 스위치1.클릭수 + 스위치2.c9 * 스위치2.클릭수 + 스위치3.c9 * 스위치3.클릭수 + 스위치4.c9 * 스위치4.클릭수 + 스위치5.c9 * 스위치5.클릭수 + 스위치6.c9 * 스위치6.클릭수 + 스위치7.c9 * 스위치7.클릭수 + 스위치8.c9 * 스위치8.클릭수 + 스위치9.c9  * 스위치9.클릭수,4) 시계9상태
        , mod(a.c10 + 스위치0.c10 * 스위치0.클릭수 + 스위치1.c10 * 스위치1.클릭수 + 스위치2.c10 * 스위치2.클릭수 + 스위치3.c10 * 스위치3.클릭수 + 스위치4.c10 * 스위치4.클릭수 + 스위치5.c10 * 스위치5.클릭수 + 스위치6.c10 * 스위치6.클릭수 + 스위치7.c10 * 스위치7.클릭수 + 스위치8.c10 * 스위치8.클릭수 + 스위치9.c10  * 스위치9.클릭수,4) 시계10상태
        , mod(a.c11 + 스위치0.c11 * 스위치0.클릭수 + 스위치1.c11 * 스위치1.클릭수 + 스위치2.c11 * 스위치2.클릭수 + 스위치3.c11 * 스위치3.클릭수 + 스위치4.c11 * 스위치4.클릭수 + 스위치5.c11 * 스위치5.클릭수 + 스위치6.c11 * 스위치6.클릭수 + 스위치7.c11 * 스위치7.클릭수 + 스위치8.c11 * 스위치8.클릭수 + 스위치9.c10  * 스위치1.클릭수,4) 시계11상태
        , mod(a.c12 + 스위치0.c12 * 스위치0.클릭수 + 스위치1.c12 * 스위치1.클릭수 + 스위치2.c12 * 스위치2.클릭수 + 스위치3.c12 * 스위치3.클릭수 + 스위치4.c12 * 스위치4.클릭수 + 스위치5.c12 * 스위치5.클릭수 + 스위치6.c12 * 스위치6.클릭수 + 스위치7.c12 * 스위치7.클릭수 + 스위치8.c12 * 스위치8.클릭수 + 스위치9.c10  * 스위치2.클릭수,4) 시계12상태
        , mod(a.c13 + 스위치0.c13 * 스위치0.클릭수 + 스위치1.c13 * 스위치1.클릭수 + 스위치2.c13 * 스위치2.클릭수 + 스위치3.c13 * 스위치3.클릭수 + 스위치4.c13 * 스위치4.클릭수 + 스위치5.c13 * 스위치5.클릭수 + 스위치6.c13 * 스위치6.클릭수 + 스위치7.c13 * 스위치7.클릭수 + 스위치8.c13 * 스위치8.클릭수 + 스위치9.c10  * 스위치3.클릭수,4) 시계13상태
        , mod(a.c14 + 스위치0.c14 * 스위치0.클릭수 + 스위치1.c14 * 스위치1.클릭수 + 스위치2.c14 * 스위치2.클릭수 + 스위치3.c14 * 스위치3.클릭수 + 스위치4.c14 * 스위치4.클릭수 + 스위치5.c14 * 스위치5.클릭수 + 스위치6.c14 * 스위치6.클릭수 + 스위치7.c14 * 스위치7.클릭수 + 스위치8.c14 * 스위치8.클릭수 + 스위치9.c10  * 스위치4.클릭수,4) 시계14상태
        , mod(a.c15 + 스위치0.c15 * 스위치0.클릭수 + 스위치1.c15 * 스위치1.클릭수 + 스위치2.c15 * 스위치2.클릭수 + 스위치3.c15 * 스위치3.클릭수 + 스위치4.c15 * 스위치4.클릭수 + 스위치5.c15 * 스위치5.클릭수 + 스위치6.c15 * 스위치6.클릭수 + 스위치7.c15 * 스위치7.클릭수 + 스위치8.c15 * 스위치8.클릭수 + 스위치9.c10  * 스위치5.클릭수,4) 시계15상태
    from    초기상태단순화 a
            , ( select * from 스위치상태조합 a where a.sw = 0 ) 스위치0
            , ( select * from 스위치상태조합 a where a.sw = 1 ) 스위치1
            , ( select * from 스위치상태조합 a where a.sw = 2 ) 스위치2
            , ( select * from 스위치상태조합 a where a.sw = 3 ) 스위치3
            , ( select * from 스위치상태조합 a where a.sw = 4 ) 스위치4
            , ( select * from 스위치상태조합 a where a.sw = 5 ) 스위치5
            , ( select * from 스위치상태조합 a where a.sw = 6 ) 스위치6
            , ( select * from 스위치상태조합 a where a.sw = 7 ) 스위치7
            , ( select * from 스위치상태조합 a where a.sw = 8 ) 스위치8
            , ( select * from 스위치상태조합 a where a.sw = 9 ) 스위치9
    where   mod(a.c0 + 스위치0.c0 * 스위치0.클릭수 + 스위치1.c0 * 스위치1.클릭수 + 스위치2.c0 * 스위치2.클릭수 + 스위치3.c0 * 스위치3.클릭수 + 스위치4.c0 * 스위치4.클릭수 + 스위치5.c0 * 스위치5.클릭수 + 스위치6.c0 * 스위치6.클릭수 + 스위치7.c0 * 스위치7.클릭수 + 스위치8.c0 * 스위치8.클릭수 + 스위치9.c0  * 스위치9.클릭수,4) = 0
    and     mod(a.c1 + 스위치0.c1 * 스위치0.클릭수 + 스위치1.c1 * 스위치1.클릭수 + 스위치2.c1 * 스위치2.클릭수 + 스위치3.c1 * 스위치3.클릭수 + 스위치4.c1 * 스위치4.클릭수 + 스위치5.c1 * 스위치5.클릭수 + 스위치6.c1 * 스위치6.클릭수 + 스위치7.c1 * 스위치7.클릭수 + 스위치8.c1 * 스위치8.클릭수 + 스위치9.c1  * 스위치9.클릭수,4) = 0
    and     mod(a.c2 + 스위치0.c2 * 스위치0.클릭수 + 스위치1.c2 * 스위치1.클릭수 + 스위치2.c2 * 스위치2.클릭수 + 스위치3.c2 * 스위치3.클릭수 + 스위치4.c2 * 스위치4.클릭수 + 스위치5.c2 * 스위치5.클릭수 + 스위치6.c2 * 스위치6.클릭수 + 스위치7.c2 * 스위치7.클릭수 + 스위치8.c2 * 스위치8.클릭수 + 스위치9.c2  * 스위치9.클릭수,4) = 0
    and     mod(a.c3 + 스위치0.c3 * 스위치0.클릭수 + 스위치1.c3 * 스위치1.클릭수 + 스위치2.c3 * 스위치2.클릭수 + 스위치3.c3 * 스위치3.클릭수 + 스위치4.c3 * 스위치4.클릭수 + 스위치5.c3 * 스위치5.클릭수 + 스위치6.c3 * 스위치6.클릭수 + 스위치7.c3 * 스위치7.클릭수 + 스위치8.c3 * 스위치8.클릭수 + 스위치9.c3  * 스위치9.클릭수,4) = 0
    and     mod(a.c4 + 스위치0.c4 * 스위치0.클릭수 + 스위치1.c4 * 스위치1.클릭수 + 스위치2.c4 * 스위치2.클릭수 + 스위치3.c4 * 스위치3.클릭수 + 스위치4.c4 * 스위치4.클릭수 + 스위치5.c4 * 스위치5.클릭수 + 스위치6.c4 * 스위치6.클릭수 + 스위치7.c4 * 스위치7.클릭수 + 스위치8.c4 * 스위치8.클릭수 + 스위치9.c4  * 스위치9.클릭수,4) = 0
    and     mod(a.c5 + 스위치0.c5 * 스위치0.클릭수 + 스위치1.c5 * 스위치1.클릭수 + 스위치2.c5 * 스위치2.클릭수 + 스위치3.c5 * 스위치3.클릭수 + 스위치4.c5 * 스위치4.클릭수 + 스위치5.c5 * 스위치5.클릭수 + 스위치6.c5 * 스위치6.클릭수 + 스위치7.c5 * 스위치7.클릭수 + 스위치8.c5 * 스위치8.클릭수 + 스위치9.c5  * 스위치9.클릭수,4) = 0
    and     mod(a.c6 + 스위치0.c6 * 스위치0.클릭수 + 스위치1.c6 * 스위치1.클릭수 + 스위치2.c6 * 스위치2.클릭수 + 스위치3.c6 * 스위치3.클릭수 + 스위치4.c6 * 스위치4.클릭수 + 스위치5.c6 * 스위치5.클릭수 + 스위치6.c6 * 스위치6.클릭수 + 스위치7.c6 * 스위치7.클릭수 + 스위치8.c6 * 스위치8.클릭수 + 스위치9.c6  * 스위치9.클릭수,4) = 0
    and     mod(a.c7 + 스위치0.c7 * 스위치0.클릭수 + 스위치1.c7 * 스위치1.클릭수 + 스위치2.c7 * 스위치2.클릭수 + 스위치3.c7 * 스위치3.클릭수 + 스위치4.c7 * 스위치4.클릭수 + 스위치5.c7 * 스위치5.클릭수 + 스위치6.c7 * 스위치6.클릭수 + 스위치7.c7 * 스위치7.클릭수 + 스위치8.c7 * 스위치8.클릭수 + 스위치9.c7  * 스위치9.클릭수,4) = 0
    and     mod(a.c8 + 스위치0.c8 * 스위치0.클릭수 + 스위치1.c8 * 스위치1.클릭수 + 스위치2.c8 * 스위치2.클릭수 + 스위치3.c8 * 스위치3.클릭수 + 스위치4.c8 * 스위치4.클릭수 + 스위치5.c8 * 스위치5.클릭수 + 스위치6.c8 * 스위치6.클릭수 + 스위치7.c8 * 스위치7.클릭수 + 스위치8.c8 * 스위치8.클릭수 + 스위치9.c8  * 스위치9.클릭수,4) = 0
    and     mod(a.c9 + 스위치0.c9 * 스위치0.클릭수 + 스위치1.c9 * 스위치1.클릭수 + 스위치2.c9 * 스위치2.클릭수 + 스위치3.c9 * 스위치3.클릭수 + 스위치4.c9 * 스위치4.클릭수 + 스위치5.c9 * 스위치5.클릭수 + 스위치6.c9 * 스위치6.클릭수 + 스위치7.c9 * 스위치7.클릭수 + 스위치8.c9 * 스위치8.클릭수 + 스위치9.c9  * 스위치9.클릭수,4) = 0
    and     mod(a.c10 + 스위치0.c10 * 스위치0.클릭수 + 스위치1.c10 * 스위치1.클릭수 + 스위치2.c10 * 스위치2.클릭수 + 스위치3.c10 * 스위치3.클릭수 + 스위치4.c10 * 스위치4.클릭수 + 스위치5.c10 * 스위치5.클릭수 + 스위치6.c10 * 스위치6.클릭수 + 스위치7.c10 * 스위치7.클릭수 + 스위치8.c10 * 스위치8.클릭수 + 스위치9.c10  * 스위치9.클릭수,4) = 0 
    and     mod(a.c11 + 스위치0.c11 * 스위치0.클릭수 + 스위치1.c11 * 스위치1.클릭수 + 스위치2.c11 * 스위치2.클릭수 + 스위치3.c11 * 스위치3.클릭수 + 스위치4.c11 * 스위치4.클릭수 + 스위치5.c11 * 스위치5.클릭수 + 스위치6.c11 * 스위치6.클릭수 + 스위치7.c11 * 스위치7.클릭수 + 스위치8.c11 * 스위치8.클릭수 + 스위치9.c10  * 스위치1.클릭수,4) = 0 
    and     mod(a.c12 + 스위치0.c12 * 스위치0.클릭수 + 스위치1.c12 * 스위치1.클릭수 + 스위치2.c12 * 스위치2.클릭수 + 스위치3.c12 * 스위치3.클릭수 + 스위치4.c12 * 스위치4.클릭수 + 스위치5.c12 * 스위치5.클릭수 + 스위치6.c12 * 스위치6.클릭수 + 스위치7.c12 * 스위치7.클릭수 + 스위치8.c12 * 스위치8.클릭수 + 스위치9.c10  * 스위치2.클릭수,4) = 0 
    and     mod(a.c13 + 스위치0.c13 * 스위치0.클릭수 + 스위치1.c13 * 스위치1.클릭수 + 스위치2.c13 * 스위치2.클릭수 + 스위치3.c13 * 스위치3.클릭수 + 스위치4.c13 * 스위치4.클릭수 + 스위치5.c13 * 스위치5.클릭수 + 스위치6.c13 * 스위치6.클릭수 + 스위치7.c13 * 스위치7.클릭수 + 스위치8.c13 * 스위치8.클릭수 + 스위치9.c10  * 스위치3.클릭수,4) = 0 
    and     mod(a.c14 + 스위치0.c14 * 스위치0.클릭수 + 스위치1.c14 * 스위치1.클릭수 + 스위치2.c14 * 스위치2.클릭수 + 스위치3.c14 * 스위치3.클릭수 + 스위치4.c14 * 스위치4.클릭수 + 스위치5.c14 * 스위치5.클릭수 + 스위치6.c14 * 스위치6.클릭수 + 스위치7.c14 * 스위치7.클릭수 + 스위치8.c14 * 스위치8.클릭수 + 스위치9.c10  * 스위치4.클릭수,4) = 0 
    and     mod(a.c15 + 스위치0.c15 * 스위치0.클릭수 + 스위치1.c15 * 스위치1.클릭수 + 스위치2.c15 * 스위치2.클릭수 + 스위치3.c15 * 스위치3.클릭수 + 스위치4.c15 * 스위치4.클릭수 + 스위치5.c15 * 스위치5.클릭수 + 스위치6.c15 * 스위치6.클릭수 + 스위치7.c15 * 스위치7.클릭수 + 스위치8.c15 * 스위치8.클릭수 + 스위치9.c10  * 스위치5.클릭수,4) = 0 
)
select
    case when count(*) = 0 then -1 else
        min(a.스위치0클릭수
        + a.스위치1클릭수
        + a.스위치2클릭수
        + a.스위치3클릭수
        + a.스위치4클릭수
        + a.스위치5클릭수
        + a.스위치6클릭수
        + a.스위치7클릭수
        + a.스위치8클릭수
        + a.스위치9클릭수)
    end 총클릭수
from    스위치상태검색 a
/
 
 
 
참고로 제 쿼리는 완전 탐색이고 마농님 쿼리는 너비우선 탐색이네요...(최악의 경우는 완전탐색)
평균수행 시간은 마농님 것이 훨 좋게 되겠구요...
 
최악은 못찾는 경우로 동일하지만
recursive-with가 일반 조인에 비해 상대적으로 느리네요..
 
그리고 아이디어나 가독성 측면에서 마농님의 쿼리가 훨 훌륭하신 듯...
김흥수(protokhs)님이 2015-04-02 17:30에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40760교차되는 값 데이타구하기 query 질문 [6]
강형석
2015-03-31
8124
40759ORA-00979 에러에 대한 문의 [1]
이성근
2015-03-31
6506
40756쿼리 퀴즈입니다.(퀵소트 따라하기) [1]
김흥수
2015-03-30
8573
40755쿼리 퀴즈입니다.(시계맞추기) [7]
김흥수
2015-03-30
9692
40754초보자 쿼리 짜는것좀 도와주세요 ㅠㅠ [2]
첼시리우
2015-03-26
6414
40753TYPE object 를 만들고 다른 디비에서 디비 링크로 사용 할 수 없나요? [2]
안녕하세요
2015-03-26
6420
40752원화환산 평잔 퀴즈입니다. [9]
김흥수
2015-03-24
8487
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다