행렬이 있고 행렬 요소를 나선형으로 인쇄해야 한다고 가정합니다. 처음에는 첫 번째 행에서 시작하여 전체 내용을 인쇄한 다음 마지막 열을 따라 인쇄한 다음 마지막 행을 따라 인쇄하는 방식으로 요소를 나선형으로 인쇄합니다. 따라서 행렬이 다음과 같은 경우 -
1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 |
출력은 [1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16]
이 문제를 해결하기 위해 다음 단계를 따릅니다.
-
currRow :=0 및 currCol :=0
-
currRow 및 currCol이 행렬 범위에 있는 동안
-
currCol 및 n-1 범위의 i에 대해
-
디스플레이 매트[currRow, i]
-
-
currRow 1 증가
-
currRow 및 m-1 범위의 i에 대해 수행
-
디스플레이 매트[i, n-1]
-
-
n을 1 감소
-
currRow
-
for i :=n-1 아래로 currCol, do
-
디스플레이 매트[m-1, i]
-
-
m을 1 감소
-
currCol
-
for i :=m-1 아래로 currRow, do
-
디스플레이 매트[i, currCol]
-
-
currCol 1 증가
-
-
-
예(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <iostream> #define ROW 3 #define COL 6 using namespace std; int array[ROW][COL] = {{1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}, {13, 14, 15, 16, 17, 18}}; void dispSpiral(int m, int n){ int i, currRow = 0, currCol = 0; while (currRow < ROW && currCol < COL){ for (i = currCol; i < n; i++){ //print the first row normally cout << array[currRow][i]<<" "; } currRow++; //point to next row for (i = currRow; i < m; ++i){ //Print the last column cout << array[i][n-1]<<" "; } n--; //set the n-1th column is current last column if ( currRow < m){ //when currRow is in the range, print the last row for (i = n-1; i >= currCol; --i){ cout << array[m-1][i]<<" "; } m--; //decrease the row range } if (currCol < n){ //when currCol is in the range, print the fist column for (i = m-1; i >= currRow; --i){ cout << array[i][currCol]<<" "; } currCol++; } } } int main(){ dispSpiral(ROW, COL); }
입력
[[1,2,3,4,5,6] [7,8,9,10,11,12] [13,14,15,16,17,18]]
출력
1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16