[퀴즈] 시험실 좌석배치도 V1 V2 V3 V4 V5 V1 V2 V3 V4 V5 V1 V2 V3 V4 V5 1 6 11 16 21 1 6 10 14 18 1 7 13 18 23 2 7 12 17 22 2 7 11 15 19 2 8 14 19 24 3 8 13 18 23 3 8 12 16 20 3 9 15 20 25 4 9 14 19 24 4 9 13 17 21 4 10 16 21 26 5 10 15 20 25 5 5 11 17 22 27 6 12
시험장은 25명씩 입장하도록 되어 있습니다.
좌석배치의 원리는 왼쪽 좌석부터 앞에서 뒤로 채우며 5줄의 좌석을 채웁니다.
25명이 시험을 치를 경우 다음과 같은 좌석배치도가 나오게 됩니다.
그러나 25명씩 시험실에 배치하다 보면 마지막 시험장의 인원은 25명이 정확하게 떨어지질 않습니다.
또한 마지막 인원이 5명 이하인 경우엔 이 인원을 전 교실에서 같이 시험을 치루도록 합니다.
이 경우 인원은 최대 30명까지가 되겠네요.
[문제] 시험실 배정인원(6 ~ 30)을 입력받아 좌석배치도를 출력하는 쿼리를 작성하세요.
[결과]
[답안1-분석함수버전] <== 트리플클릭
SELECT MIN(DECODE(x,1,v)) v1
, MIN(DECODE(x,2,v)) v2
, MIN(DECODE(x,3,v)) v3
, MIN(DECODE(x,4,v)) v4
, MIN(DECODE(x,5,v)) v5
FROM (SELECT v, x
, ROW_NUMBER() OVER(PARTITION BY x ORDER BY v) y
FROM (SELECT v
, NTILE(5) OVER(ORDER BY v) x
FROM (SELECT LEVEL v FROM dual CONNECT BY LEVEL <= :Inwon)
)
)
GROUP BY y
ORDER BY 1
;
[답안2-일반버전] <== 트리플클릭
SELECT MIN(DECODE(x,1,v)) v1
, MIN(DECODE(x,2,v)) v2
, MIN(DECODE(x,3,v)) v3
, MIN(DECODE(x,4,v)) v4
, MIN(DECODE(x,5,v)) v5
FROM (SELECT v
, CASE WHEN v <= v_m * v_c
THEN CEIL(v / v_c)
ELSE CEIL((v - v_m) / v_f)
END x
, CASE WHEN v <= v_m * v_c
THEN REPLACE(MOD(v , v_c), 0, v_c)
ELSE REPLACE(MOD((v - v_m) , v_f), 0, v_f)
END y
FROM (SELECT LEVEL v
, MOD(:Inwon, 5) v_m
, CEIL(:Inwon / 5) v_c
, FLOOR(:Inwon / 5) v_f
FROM dual
CONNECT BY LEVEL <= :Inwon
)
)
GROUP BY y
ORDER BY y
;