본문 바로가기
알고리즘

달팽이 문제

by minkang 2021. 9. 15.

코딩테스트에서 달팽이 관련 문제가 나왔는데 어려워서 간단한 달팽이를 그려봤습니다.

public class 달팽이 {
	public static void main(String[] args) {
		int N = 8;
		int[][] map = new int[N][N];
		int sx = 0;
		int sy = 0;
		makeSnail(map, sx, sy, 4, 1);
		for(int i=0; i<map.length; i++) {
			for(int j=0; j<map.length; j++) {
				System.out.printf("%2d ", map[i][j]);
			}
			System.out.println();
		}
		
	}
	static void makeSnail(int[][] map, int sx, int sy, int length, int sValue){
		int dx[] = new int[] { 0, 1, 0, -1};
		int dy[] = new int[] { 1,0,-1,0};
		int dirLength=length;
		int dirCnt=0;
		int dir= 0;
		
		int cx = sx;
		int cy = sy;
		int cValue = sValue;
		while(map[cx][cy] == 0) {
			map[cx][cy] = cValue++;
			dirCnt++;
			if(dirCnt == dirLength) {
				if(dir == 0 || dir == 2) {
					dirLength--;
				}
				dirCnt = 0;
				dir = (dir + 1) % 4;
			}
			cx += dx[dir];
			cy += dy[dir];
		}
	}
}

출력 결과

달팽이를 그릴 시작점과 가로의 길이를 받아옵니다.

dir은 방향,

dirLength는 그 방향으로 몇번가고 방향을 바꿀지,

dirCnt는 그 방향으로 몇번 갔는지 나타내는 변수입니다.

 

위의 출렬 결과를 보면 좌,우로 갈때마다 dirLength가 1씩 줄어드는 것을 확인할 수 있습니다.

따라서 dirLength와 dirCnt가 같아질 때 방향을 바꾸고, 방향이 좌, 우였다면 dirLength도 1을 줄여줍니다.

그리고 dirCnt는 다시 0으로 초기화 해줍니다.

 

이처럼 달팽이를 하나 그리는 것은 간단한 대에 비해

달팽이를 재귀로 중첩하여 그리는 것이 힘들었습니다.

 

입력이 [2,2,2]가 주어지면 2x2 크기의 작은 달팽이를 그린 후에, 4x4크기에 이전의 작은 달팽이를 하나의 사각형으로 가정하여 달팽이를 그립니다. 그 다음 8x8 크기에 이전의 4x4 달팽이를 하나의 사각형으로 가정하고 또 달팽이를 그립니다.

이처럼 재귀의 형식으로 나타나고 있습니다.

좀 더 공부한 후에 다시 풀어봐야겠습니다.