본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 1954 달팽이

by 까망 하르방 2021. 3. 1.
반응형

출처: SWEA 

 Input 

2

3

4

 

 Output 

#1

1 2 3

8 9 4

7 6 5

#2

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

 

N이 주어졌을 때, 방향이 바뀌는 시점 채워지는 값에 유의하며 구현

- 방향이 바뀌는 시점: 벽면이거나, 이미 숫자가 채워진 경우

- 채워지는 값: 1~N*N


import java.util.Scanner;
 
public class Solution {
    // 달팽이 모양을 그릴 수 있도록 우,하,좌,상
    static public int[] dx = {0, 1, 0, -1};
    static public int[] dy = {1, 0, -1, 0};
    static public int N;
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
 
        // TestCase
        int tc = Integer.parseInt(sc.next());
        int probNo = 1;
 
        while (tc-- > 0) {
            N = Integer.parseInt(sc.next());
            System.out.println("#" + (probNo++));
            printMap(makeSnail());
        }
    }
 
 
    private static void printMap(int[][] map) {
        for(int i=0; i<N; i++) {
            for(int j=0; j<N; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
 
 
    private static int[][] makeSnail() {
        int[][] map = new int[N][N];
         
        int i = 1;
        Vertex v = new Vertex(0, 0);
        int dir = 0;
        while(true) {
            // 배열 원소값 할당
            map[v.x][v.y] = i++;
             
            if(i > N * N) break;
             
            // 다음 좌표
            int nX = v.x + dx[dir];
            int nY = v.y + dy[dir];
             
            // 배열의 범위를 벗어나면 방향을 바꾼다. (외곽 테두리)
            if(nX < 0 || nY < 0 || nX >= N || nY >= N ) {
                dir = changeDir(dir);
                nX = v.x + dx[dir];
                nY = v.y + dy[dir];
            }
             
            // 기존의 이미 숫자를 만들어진 곳이라면 방향을 바꾼다. (내부로 탐색 과정에서...)
            // (Java) 2차원 배열 원소 초기값 = 0 이용.
            if(map[nX][nY] != 0) {
                dir = changeDir(dir);
                nX = v.x + dx[dir];
                nY = v.y + dy[dir];
            }
             
            // 다음 Spot으로 좌표 이동
            v.x = nX;
            v.y = nY;
        }
        return map;
    }
 
    private static int changeDir(int dir) {        
        return (dir + 1) % 4;
    }
}
 
 
class Vertex{    
    int x, y;
    public Vertex(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

 

반응형

'PS 문제 풀이 > SWEA' 카테고리의 다른 글

[SWEA] 8382 방향 전환  (0) 2021.03.01
[SWEA] 1974 스도쿠 검증  (0) 2021.03.01
[SWEA] 3816 아나그램  (0) 2021.03.01
[SWEA] 3819 최대 부분 배열  (0) 2021.02.28
[SWEA] 2814 최장경로  (0) 2021.02.27

댓글