자주 접하는 문제임에도 익숙해지지 않는 Spiral Matrix.
n by n 배열에 우->하->좌->상으로 돌리면서 숫자를 배열하는 방식이다.
0 1 2 3 4 5
19 20 21 22 23 6
18 31 32 33 24 7
17 30 35 34 25 8
16 29 28 27 26 9
15 14 13 12 11 10
깔끔한 알고리즘이 많이 있지만 한방향에만 특화되어있고, 좌, 우 방향 모두 써먹을 수 있는건 단순한 알고리즘이 최고인듯하다.
public class SpiralArray {
public static void main(String[] args) {
int iArraySize = 6;
int[][] arrResult = makeSpiralArray(iArraySize);
for(int i=0 ; i< arrResult.length ; i++){
for(int j=0 ; j< arrResult.length ; j++){
int iSpaceCnt = Integer.toString(iArraySize*iArraySize).length() - Integer.toString(arrResult[i][j]).length();
for(int k=0 ; k < iSpaceCnt ; k++ ) {
System.out.print(" ");
}
System.out.print(arrResult[i][j]);
System.out.print(" ");
}
System.out.println("");
}
}
public static int[][] makeSpiralArray(int size){
int[][] sSpiralArray = new int[size][size];
int maxRow = size -1;
int maxCol = size -1;
int minRow = 0;
int minCol = 0;
int k = 0;
while (k < size*size) {
for( int j = minCol ; j < maxCol ; j++) {
sSpiralArray[minRow][j] = k;
k++;
}
for( int i = minRow ; i < maxRow ; i++) {
sSpiralArray[i][maxCol] = k;
k++;
}
for( int j = maxCol ; j > minCol ; j--) {
sSpiralArray[maxRow][j] = k;
k++;
}
for( int i = maxRow ; i > minRow ; i--) {
sSpiralArray[i][minCol] = k;
k++;
}
minCol++;
minRow++;
maxRow--;
maxCol--;
}
return sSpiralArray;
}
}
'Tech-Algorithm' 카테고리의 다른 글
동적프로그래밍 - 배낭 채우기 문제(Knapsack Problem) (0) | 2022.06.14 |
---|---|
Matrix Rotate (0) | 2018.07.12 |
댓글