Problem Solving/알고리즘

알고리즘 문제풀이(Java) - 달팽이문제(2차원배열)

돌돌김 2019. 1. 6. 02:18

 

달팽이 문제란 

 

1   2   3   4  5 

16 17 18 19  6

15 24 25 20  7

14 23 22 21  8

13 12 11 10  9

 

와 같이 숫자가 시계방향으로 돌아가면서 바깥부터 안쪽으로 채워지는 형태의 2차원 배열을 구현하는것을 의미한다.

 

숫자는 어차피 1씩 증가하면서 배열에 저장되므로 중점을 두고 보아야 할 부분은 '배열의 index'이다. 

 

편의상 배열의 index는 arr[i][j]로 한다.

 

달팽이 문제는 크게 다음과 같은 두가지 관점으로 볼 수 있다.

  • 가로(width)부분은 j값의 증감
  • 세로(length)부분은 i값의 증감

 

1set를 시작지점에서 가로 혹은 세로의 끝 지점까지 간다고 볼 때 각 set는 다음과 같다.

  • 0~5까지를 보면 arr[0][0], arr[0][1] , arr[0][2], arr[0][3], arr[0][4]에 각각의 값이 저장되었다.
    • 1set에서는 i는 가만히 있고 j가 1씩 증가했다.
  • 6~9까지를 보면 arr[1][4], arr[2][4], arr[3][4], arr[4][4]에 각각의 값이 저장되었다.
    • 2set에서는 j가 가만히 있고 i가 1씩 증가했다.
  • 10~13까지를 보면 arr[4][3], arr[4][2], arr[4][1], arr[4][0]에 각각의 값이 저장되었다.
    • 3set에서는 i는 가만히 있고 j가 1씩 감소했다.
  • 14~16까지를 보면 arr[3][0], arr[2][0], arr[1][0]에 각각의 값이 저장되었다.
    • 4set에서는 i가 1씩 감소하고 j는 가만히 있었다.

 

결론

 

1~4set의 규칙이 계속해서 반복되며 숫자가 채워진다. 

  •  j가 끝까지 증가 -> i가 끝까지 증가 -> j가 끝까지 감소 -> i가 끝까지 감소 

 

여기서 끝까지라는 말은 값이 채워지지 않은 부분까지를 말한다. 

 

끝까지 간다고 해서 이미 '1'이 들어있는 arr[0][0]에 다른 값이 들어올 수는 없다.

 

while loop로 전체를 감싸는 반복문을 만들고 그 안에 1~4set을 구성하는 각각의 for loop을 구성한다.

 

 

 

 

소스코드

 

import java.util.Scanner;
   public class TwoDimArray_Spiral{
	   public static void main(String[] args){
		   int size = 0;
		   Scanner sc = new Scanner(System.in);
		   System.out.println("배열의 크기를 입력하세요");
           size = sc.nextInt();
           int [][] arr = new int[size][size];
           int num = 1; // 배열에 들어갈 첫번째 숫자
           int count = size*size; // 마지막 숫자
           int i = 0; int j = 0;
           int width = size;
           int length = size-1;
           while(num<=count){
               for(int k=0; k<width; k++){
                   arr[i][j] = num;
                   j++; num++;
               }width--; i++; j--;

               for(int k=0; k<length; k++){
                    arr[i][j] = num;
                    i++; num++;
               }length--; i--; j--;

               for(int k=0; k<width; k++){
                   arr[i][j] = num;
                   j--; num++;
               }width--; i--; j++;

               for(int k=0; k<length; k++){
                    arr[i][j] = num;
                    i--; num++;
               }length--; i++; j++;               
           }
	   }
       for(int i=0; i<arr.length; i++){
           for(int j=0; j<arr[i].length; j++){
               System.out.printf("%3d", arr[i][j]);
           }
           System.out.println()
       }
   }