본문으로 바로가기

달팽이 알고리즘

category 컴퓨터/알고리즘 2016. 6. 15. 10:51
안녕하세요? QRD입니다.

오늘은 알고리즘 문제를 풀어 볼 겁니다.
인터넷에 많이 떠도는 문제 위주로 발췌해서 스스로 한 번 풀어보고 공유하는 거라 정확한 답이 될 순 없어요.
혹시 제가 구현한 것보다 더 쉽고 괜찮은 알고리즘으로 해결하신다면 공유 좀 부탁드립니다.
문제 나갑니다.
12345
161718196
152425207
142322218
131211109

위와 같은 모양으로 숫자를 출력해 보세요.

한 번쯤은 보셨을 일명 달팽이 알고리즘 입니다.
무궁무진한 코딩 방법이 존재하겠지만, 저는 아래와 같이 코딩하였습니다.

package test;
import java.util.Scanner;
public class test {

public static void main(String args[]) {
	snailAlgorithm();
}
	public static boolean snailAlgorithm() {
		Scanner scan = new Scanner(System.in);
		int length = scan.nextInt(); // 원하는 정사각형 변의 길이 입력하기.
		int[][] matrix = new int[length][length];
		int cnt = 1; // 숫자
		int x = -1; // x축
		int y = 0; // y축
		int step = length; // 거리
		int direct = 1; // 방향

			while (true) {
			for (int i = 0; i < step; i++) { // → ← 방향 출력
				x = x + direct;
				matrix[y][x] = cnt;
				cnt++;
			}

				if (step < 1) { // 더 이상 진행할 방향이 없으면 return
				printMatrix(matrix);
				return false;
			}

			step = step - 1;

			for (int i = 0; i < step; i++) {   // ↑ ↓ 방향 출력
				y = y + direct;
				matrix[y][x] = cnt;
				cnt++;
			}
			direct = direct * -1; // 180도 방향 전환
		}
	}
	/**
 	* 2차원 배열을 출력해주는 메서드
 	* @param matrix
	*/
	public static void printMatrix(int matrix[][]) {
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix.length; j++) {
				System.out.print(matrix[i][j] + "\t");
			}
			System.out.println("\n");
		}
	}
}
실행 후 맨 처음 원하는 정사각형의 크기를 입력합니다.(ex. 5)
달팽이 알고리즘을 잘 살펴보면,
→ 방향 : 5, ↓ 방향 : 4, ← 방향 : 4, ↑ 방향 : 3, → 방향 : 3, ↓ 방향 : 2, ← 방향 : 2, ↑ 방향 : 1, → 방향 : 1 (표시한 숫자만큼 그려 나가야 함.)
x 와 y 의 크기는 증가,고정 / 고정,증가, / 감소,고정/ 고정,감소
힌트는 여기까지 드리겠습니다. 주석과 위에 간단한 설명을 보시면 해석 가능할 것입니다.

감사합니다. QRD였습니다. 꾸벅(_ _)

'컴퓨터 > 알고리즘' 카테고리의 다른 글

개미수열 알고리즘  (1) 2016.06.22
모래시계 알고리즘  (0) 2016.06.20