코딩테스트에서 달팽이 관련 문제가 나왔는데 어려워서 간단한 달팽이를 그려봤습니다.
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 달팽이를 하나의 사각형으로 가정하고 또 달팽이를 그립니다.
이처럼 재귀의 형식으로 나타나고 있습니다.
좀 더 공부한 후에 다시 풀어봐야겠습니다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] 문자열 압축 - java (0) | 2021.09.22 |
---|---|
[카카오 블라인드 2018] [1차] 캐시 - java (0) | 2021.09.16 |
[프로그래머스] 예상 대진표 - java (1) | 2021.09.06 |
[SW Expert Academy] 원자 소멸 시뮬레이션 - java (0) | 2021.09.01 |
[SW Expert Academy] 핀볼게임 - java (0) | 2021.08.31 |