반응형
달팽이
달팽이는 배열의 한축 값을 입력받아 외곽부터 점차 가운데로 숫자가 채워지는 것.
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 09for이나 while을 이용해서 구현할 수 있다면 완전 이해했다고도 볼 수 있는 난이도가 높은편에 속한다.
여러가지 방법이 있지만 개인적으로 사용한 방법은 아래와 같다.
- 숫자가 시작점에서 한쪽 변 끝까지 가는 경우를 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(""); } }
반응형
'컴퓨터구조 및 자료구조' 카테고리의 다른 글
metric prefixes(미터법 접두사), si 접두어 (0) | 2018.10.06 |
---|---|
프로그래머가 이해해야하는 것 - 이진수, 십진수, 십육진수, 비트, 바이트 (2) | 2018.10.06 |
DAY005. SW Engineering & Programming Language (1) | 2017.01.13 |
DAY004. DB and Network (0) | 2017.01.12 |
DAY003. Computer Sciensce & Data Structuer & Algorithm (1) | 2017.01.11 |
댓글