말랑한 하루

[SW Expert Academy] 1954 달팽이 숫자 [Java] 본문

문제풀이/SWexpert Academy

[SW Expert Academy] 1954 달팽이 숫자 [Java]

지수는말랑이 2021. 2. 2. 22:47
반응형

[ 핵심풀이 ]

0) 방향을 바꿔주는것이 핵심!

1) 최대범위는 배열의개수 즉, 입력된 수의 제곱!

2) 방향을 바꿀땐 범위를 벗어나는지, 이미 밟고 간곳인지 확인!

[ 핵심소스 ]

 //전체를 돌며 방향전환, 숫자찍기!
 for(int i=0;i<N*N;i++) {
    ary[y][x] = cnt++;
    if (range(y+ay[dir],x+ax[dir])) dir = dir+1>3 ? 0:dir+1;
    y+=ay[dir];
    x+=ax[dir];
}
//범위확인!
static boolean range(int y, int x) {
    return y<0||x<0||y>N-1||x>N-1||ary[y][x] != 0;
}

[ Java ]

import java.util.Arrays;
import java.util.Scanner;

public class _1954_달팽이숫자 {
    static int N;
    static int ary[][];
    static void init() {
        Scanner sc = new Scanner(System.in);
        int tc = sc.nextInt();
        for(int t=1;t<=tc;t++) {
            N = sc.nextInt();
            System.out.println("#"+tc);
            solve();
            view();
        }
    }
    static int ay[] = {0,1,0,-1};
    static int ax[] = {1,0,-1,0};
    static void solve() {
        int cnt=1;
        ary = new int [N][N];
        for(int item[] : ary)
            Arrays.fill(item, 0);
		
        int y=0, x=0, dir=0;
        for(int i=0;i<N*N;i++) {
            ary[y][x] = cnt++;
            if (range(y+ay[dir],x+ax[dir])) dir = dir+1>3 ? 0:dir+1;
            y+=ay[dir];
            x+=ax[dir];
        }
    }
    static boolean range(int y, int x) {
        return y<0||x<0||y>N-1||x>N-1||ary[y][x] != 0;
    }
    static void view() {
        for(int i=0;i<N;i++) {
            for(int j=0;j<N;j++)
                System.out.print(ary[i][j]+" ");
            System.out.println();
        }
    }
    public static void main(String[] args) {
        init();
    }
}
반응형
Comments