[SQ020421.001]
"#R004.미로찾기 1" 이 업그레이드 되어 찾아왔습니다.
1. 문제
다음 제시되는 미로 맵 데이터를 바탕으로 출발점에서 목적지까지 최단 경로를 찾고, 찾은 경로를 맵에 출력하시오.
주) 사용자 정의 프로시져나 사용자 함수 사용 불가. SQL 만 사용
hint) 계층형 탐색 활용
2. 미로 설명
미로찾기 맵은 다음 그림1)과 같은 20x20 구조의 평면이 1F, 2F로 총 2층으로 구성되어 있습니다. 가장자리는 맵의 위치를 확인하기 위한 가이드라인입니다. 맵의 위치는 (행번호,열번호) 으로 표현하며, 가장자리의 위치 가이드라인을 참고하시면 됩니다.
검정색 [2] 는 벽을 의미하고, 흰색 [1] 은 통로를 의미합니다. 미로의 출발지는 1F에 존재하는 파란색 [1]의 위치(2,1)부터 시작할 수 있으며, 목적지는 2F에 존재하는 노란색 [9] 입니다. 빨강색 [5]는 1F와 2F를 연결해 주는 지점으로 4개가 존재합니다.네 개의 [5] 위치는 변경되어도 무조건 1F과 2F 연결 목적에 맞게 동일한 위치에 있어야 합니다. [9]가 4개 존재하지만, 4개 중 하나만 만나면 탐색을 멈출 수 있습니다.
그림2)은 그림1)에 대한 탐색 결과에 대한 예시이고, 그림3)과 같이 1F를 먼저 출력하고 2F 맵을 출력합니다.
탐색 결과는 '*' 문자로 출력되어야 합니다. (색은 설명용이며, 출력은 값만 출력하면 됨)
3. 데이터
미로찾기 맵은 다음과 SQL로 데이터를 생성합니다.
SQ_MIRO_MAP_2F_20X20 테이블에는 층명(FL_NM : '1F' or '2F' ), 행번호(RNO), 열번호(CNO), 값(MVAL), 행데이터(MDATA)로 구성되어 있습니다. 그림3)은 결과에 대한 실제 모습입니다.
DROP TABLE SQ_MIRO_MAP_2F_20X20 PURGE;
CREATE TABLE SQ_MIRO_MAP_2F_20X20 AS
SELECT FL_NM
,RNO
,C.NO1 CNO
,REGEXP_SUBSTR(MDATA,'[0-9]',1,C.NO1) MVAL
,MDATA
FROM
(
SELECT '1F' FL_NM, 1 RNO,'22222222222222222222' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 2 RNO,'11111111111112111252' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 3 RNO,'22222221222212221212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 4 RNO,'21112111211111111212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 5 RNO,'21212121222222221212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 6 RNO,'21212121211111111112' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 7 RNO,'25212121212222222222' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 8 RNO,'22212121211111111112' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM, 9 RNO,'21112121222222212212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,10 RNO,'21212122222111111212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,11 RNO,'21212121122222221212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,12 RNO,'21212121222211111212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,13 RNO,'21211121212112221212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,14 RNO,'21222221212222122212' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,15 RNO,'21111111211111121112' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,16 RNO,'22221222212222221222' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,17 RNO,'21111211111111111112' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,18 RNO,'21222222122222222222' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,19 RNO,'21152111111111111152' MDATA FROM DUAL UNION ALL
SELECT '1F' FL_NM,20 RNO,'22222222222222222222' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 1 RNO,'22222222222222222222' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 2 RNO,'21111211211112111252' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 3 RNO,'21221221212212221212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 4 RNO,'21211111212111121212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 5 RNO,'21212221212222121212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 6 RNO,'21212121212111111212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 7 RNO,'25222121212222122212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 8 RNO,'22212121211112111112' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM, 9 RNO,'21112111222222222212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,10 RNO,'21212222299112111212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,11 RNO,'21212111199212221222' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,12 RNO,'21212121222212111212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,13 RNO,'21211121211212121212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,14 RNO,'21222221212212122212' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,15 RNO,'21111121211112121112' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,16 RNO,'21222222212222121222' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,17 RNO,'21112111111111111112' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,18 RNO,'21222122122212222222' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,19 RNO,'21152112111211111152' MDATA FROM DUAL UNION ALL
SELECT '2F' FL_NM,20 RNO,'22222222222222222222' MDATA FROM DUAL
) MAP
,COPY_T C
WHERE C.NO1 <= 20
ORDER BY FL_NM,RNO
;
/*
맵 조회
*/
SELECT FL_NM
,RNO
,MAX(DECODE(CNO, 1,MVAL)) AS C01
,MAX(DECODE(CNO, 2,MVAL)) AS C02
,MAX(DECODE(CNO, 3,MVAL)) AS C03
,MAX(DECODE(CNO, 4,MVAL)) AS C04
,MAX(DECODE(CNO, 5,MVAL)) AS C05
,MAX(DECODE(CNO, 6,MVAL)) AS C06
,MAX(DECODE(CNO, 7,MVAL)) AS C07
,MAX(DECODE(CNO, 8,MVAL)) AS C08
,MAX(DECODE(CNO, 9,MVAL)) AS C09
,MAX(DECODE(CNO,10,MVAL)) AS C10
,MAX(DECODE(CNO,11,MVAL)) AS C11
,MAX(DECODE(CNO,12,MVAL)) AS C12
,MAX(DECODE(CNO,13,MVAL)) AS C13
,MAX(DECODE(CNO,14,MVAL)) AS C14
,MAX(DECODE(CNO,15,MVAL)) AS C15
,MAX(DECODE(CNO,16,MVAL)) AS C16
,MAX(DECODE(CNO,17,MVAL)) AS C17
,MAX(DECODE(CNO,18,MVAL)) AS C18
,MAX(DECODE(CNO,19,MVAL)) AS C19
,MAX(DECODE(CNO,20,MVAL)) AS C20
FROM (
SELECT FL_NM
,RNO,CNO
,MVAL
FROM SQ_MIRO_MAP_2F_20X20
)
GROUP BY FL_NM,RNO
ORDER BY FL_NM,RNO
;
'Thinking in Data > [DL] DataSQL' 카테고리의 다른 글
[SQL수다] #002. SQL 작성하기 전 데이터를 그려라 (0) | 2020.09.01 |
---|---|
[SQL Quiz] #R006. 행렬 곱셈 (0) | 2020.04.27 |
[SQL Quiz] 가이드 (0) | 2020.04.16 |
[SQL Quiz] #R004. 미로 찾기 1 (0) | 2020.04.15 |
[SQL Quiz] #R003. 문자열 산식 계산 3 (덧셈/뺄셈/곱셈/나눗셈) (2) | 2020.04.13 |