일단 시작해보는 블로그

[알고리즘_개념] 2차원 배열, 달팽이 알고리즘 본문

CS/알고리즘 개념

[알고리즘_개념] 2차원 배열, 달팽이 알고리즘

Selina Park 2019. 9. 17. 13:43

달팽이 모양으로 출력

import java.util.Scanner;

// 배열 달팽이 알고리즘
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int[][] A = new int[n][n];

        // Filling data.
        int K = 1, f = 0;
        while(K <= n*n){
            // 1. 윗부분
            for(int j=f; j<n-f; j++){
                A[f][j] = K++;
            }

            // 2. 오른쪽 할당
            int k = f+1;
            for(int i=k; i<n-f; i++){
                A[i][n-f-1] = K++;
            }

            // 3. 아래 할당
            k = n-f-2;
            for(int j=k; j>=f; j--){
                A[n-f-1][j] = K++;
            }

            // 4. 왼쪽 할당
            k = n-f-2;
            for(int i=k; i>f; i--){
                A[i][f] = K++;
            }

            f+=1;
        }

        print(n, A);
    }

    public static void print(int n, int[][] array){
        // print
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }
}

달팽이 모양 출력

 

 

달팽이 모양으로 출력 후, 시계방향으로 한칸 옮기기 or 반시계 방향으로 한칸 옮기기

package arrayAlgorithm;

import java.util.*;

public class Array_Snail_Rotation {
    public static int[][] snailRotation(int n, Queue<Integer> q){
        int[][] B = new int[n][n];

        int f = 0;
        while(!q.isEmpty()){
            // 1. 윗부분
            for(int j=f; j<n-f; j++){
                B[f][j] = q.poll();
            }

            // 2. 오른쪽 할당
            int k = f+1;
            for(int i=k; i<n-f; i++){
                B[i][n-f-1] = q.poll();
            }

            // 3. 아래 할당
            k = n-f-2;
            for(int j=k; j>=f; j--){
                B[n-f-1][j] = q.poll();
            }

            // 4. 왼쪽 할당
            k = n-f-2;
            for(int i=k; i>f; i--){
                B[i][f] = q.poll();
            }

            f+=1;
        }

        return B;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int[][] A = null;

        // 0이면 시계방향
        // 1이면 반시계방향
        int direction = sc.nextInt();

        int[] originArr = new int[n*n];

        //원본 값 입력 받기
        for(int i=0; i<n*n; i++){
            originArr[i] = i+1;
        }

        int pointer = 0;
        // 시계 방향
        if(direction == 0){
            ++pointer;
        }else if(direction == 1){
            // 반 시계 방향
            --pointer;
        }

        if(pointer < 0){
            pointer = originArr.length-1;
        }

        //큐에 담기
        Queue<Integer> q = new LinkedList<>();
        for(int t=0; t<originArr.length; t++){
            if(pointer >= originArr.length){
                pointer = 0;
            }
            q.offer(originArr[pointer++]);
        }

        A = snailRotation(n, q);
        print(n, A);

    }

    public static void print(int n, int[][] array){
        // print
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }
}

시계방향으로 한칸 
반시계 반향 한칸

Comments