본문 바로가기
컴퓨터구조 및 자료구조

달팽이 코드

by 피톤치즈 2017. 2. 5.
반응형

달팽이

  1. 달팽이는 배열의 한축 값을 입력받아 외곽부터 점차 가운데로 숫자가 채워지는 것.

    • ex -> 크기가 5인 
      01 02 03 04 05
      16 17 18 19 06
      15 24 25 20 07
      14 23 22 21 08
      13 12 11 10 09

    • for이나 while을 이용해서 구현할 수 있다면 완전 이해했다고도 볼 수 있는 난이도가 높은편에 속한다.

  2. 여러가지 방법이 있지만 개인적으로 사용한 방법은 아래와 같다.

    • 숫자가 시작점에서 한쪽 변 끝까지 가는 경우를 for문 1개로 구현이 가능하다고 생각
    • 5의 경우 5 by 5의 배열이 필요하고 위의 경우 처럼 생각하면 아래와 같은 수가 나옴.
    • 5 4 4 3 3 2 2 1 1
    • 이건 일정한 규칙성을 가진다. 만약 7의 경우면 아래와 같음.
    • 7 6 6 5 5 4 4 3 3 2 2 1 1
    • 3이면 3 2 2 1 1 이다. 규칙성을 찾았는가??
 - 7 6 6 5 5 4 4 3 3 2 2 1 1
 - 5 4 4 3 3 2 2 1 1
 - 3 2 2 1 1
  • 아직인가??
 - 7 6 6 5 5 4 4 3 3 2 2 1 1
 -         5 4 4 3 3 2 2 1 1
 -                 3 2 2 1 1
  • 이것은 어떤지???
  • 규칙성을 찾았다면 5의 경우로 해서 다시 배열모양처럼 본다면…
start -> .     5
            .  3
         3  1  1  2  4
               2  .
               4     .
  • 이러한 모양으로 배열이 진행이 된다. 여기서 또다른 규칙성은..
  • 위에 모양에서 점을 이으면 좌우가 나뉘고 우측은 배열의 숫자가 증가하고, 좌측은 배열의 숫자가 줄어드는 부분이다.
  • 따라서 max라는 변수를 둬서 줄어드는 성향은 정해져 있으니 그 시점에서 -1을 하고
  • for문을 max까지 돌리면 된다.
  • 배열은 2차 배열을 사용해야하므로 2개의 변수로 숫자를 줄이거나 늘리면 된다.
  • 그리고 숫자는 1 부터 시작하여 입력 숫자의 제곱(3이면 9, 5면 25)까지 증가하므로 1씩 증가할 변수가 있으면 된다.
  • 기본적으로 돌아갈 for문과 그안에서 한바퀴씩 이동할 for문을 구현하면 프로그램 구현이 가능하다.
  • 소스예제.
public void showSnailArrFor(int count) {
    int[][] Arr = new int[count][count];    //저장할 변수
    int idx1 = 0;
    int idx2 = 0;

    int cnt = 1;        //1~count의 제곱까지 1씩 증가할 변수
    int max = count;    //max

    int xAxis = -1;        //가로 이동 변수
    int yAxis = 0;        //세로 이동 변수

    //초기화
    for ( idx1 = 0; idx1 < count; idx1++ ) {
        for ( idx2 = 0; idx2 < count; idx2++) {
            Arr[idx1][idx2] = -1;
        }
    }

    for ( idx1 = 0; idx1 < count; idx1++) {        //base for loop
        for (idx2 = 0; idx2 < max; idx2++) {    //가로 증가.
            xAxis++;
            Arr[yAxis][xAxis] = cnt;
            cnt++;
        }

        max--;            //max - 1

        if (max == 0) {    //max가 0이면 for문 종료.
            break;            //사실 이 if문은 필요없으나 5인경우 base loop가 5번을 돌아야 하는데 3번 중간에 내부 for loop은 동작이 끝나므로 break를 사용해줌.
        }

        for (idx2 = 0; idx2 < max; idx2++) {    //세로 증가.
            yAxis++;
            Arr[yAxis][xAxis] = cnt;
            cnt++;
        }

        for (idx2 = 0; idx2 < max; idx2++) {    //가로 감소
            xAxis--;
            Arr[yAxis][xAxis] = cnt;
            cnt++;
        }

        max--;

        for (idx2 = 0; idx2 < max; idx2++) {    //세로 감소.
            yAxis--;
            Arr[yAxis][xAxis] = cnt;
            cnt++;
        }
    }

    //출력 구문.
    for ( idx1 = 0; idx1 < count; idx1++) {
        for ( idx2 = 0; idx2 < count; idx2++) {
            System.out.print(String.format("%02d ", Arr[idx1][idx2]));
        }
        System.out.println("");
    }
}


반응형

댓글