SWEA(SW Expert Academy) 1954. 달팽이 숫자 D2

heesan·2024년 8월 31일

코딩테스트

목록 보기
18/40

●문제 출처

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq

●정리(요약)
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

N크기의 달팽이를 출력

1 2 3

8 9 4

7 6 5

0,0 -> 0,1 -> 0,2 -> 1,2 -> 2,2 -> 1,2 -> 0,2 -> 0,1 -> 1,1

순으로 만들어 진다.

●코드1

import java.util.Scanner;
 
class Solution
{
    static int [][] arr;
    static boolean [][] visited;
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
     
        int T = sc.nextInt();
         
        for(int i = 0; i<T ; i++) {
            int N = sc.nextInt();
            arr = new int[N][N];
            visited = new boolean[N][N];
                     
            clockSort(0,0,1,1);
            sb.append("#").append(i+1).append("\n");
            for(int j=0; j<N; j++) {
                for(int k=0; k<N; k++) {
                 sb.append(arr[j][k]+" ");
                }
                sb.append("\n");
            }
        }
         
        System.out.println(sb.toString());
 
    }
     
     
    public static void clockSort(int x, int y,int count ,int as) {
        if (count > arr.length * arr.length) {
            return;
        }
 
        switch (as) {
        case 1:
            while(arr.length>x&& !visited[y][x]) {
                arr[y][x]=count++;
                visited[y][x]=true;
                x++;
            }
            clockSort(x-1,y+1,count,as+1);
            break;
        case 2:
            while(arr.length>y&& !visited[y][x]) {
                arr[y][x]=count++;
                visited[y][x]=true;
                y++;
            }
            clockSort(x-1,y-1,count,as+1);
            break;
        case 3:
            while(0<=x&& !visited[y][x]) {
                arr[y][x]=count++;
                visited[y][x]=true;
                x--;
            }
            clockSort(x+1,y-1,count,as+1);
            break;
        case 4:
            while(y >= 0&&!visited[y][x]) {
                arr[y][x]=count++;
                visited[y][x]=true;
                y--;
            }
            clockSort(x+1,y+1,count,1);
            break;
        }
 
    }
 
}

● 코드2

import java.util.Scanner;
 
class Solution
{
    static int [] dx = {1,0,-1,0};
    static int [] dy = {0,1,0,-1};
 
    public static void main(String args[]) throws Exception{
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
         
        int T = sc.nextInt();
         
        for(int i =0 ; i<T; i++) {
            int N = sc.nextInt();
            int [][] arr = new int[N][N];
             
            int hx = 0;
            int hy = 0;
            int d =0;
             
            for(int j=0; j<N*N;j++) {
                arr[hy][hx]=j+1;
                if(hx+dx[d]>=arr.length|| hy+dy[d]>=arr.length ||hy+dy[d]<0 || hx+dx[d]<0 || arr[hy+ dy[d]][hx+dx[d]]!=0) {
                    d++;
                    if(d>3) {
                        d=0;
                    }
                }
                hx = hx+ dx[d];
                hy = hy+ dy[d];
            }
             
             
            sb.append("#").append(i+1).append("\n");
            for(int j=0; j<N; j++) {
                for(int k=0; k<N; k++) {
                 sb.append(arr[j][k]+" ");
                }
                sb.append("\n");
            }
        }
         
        System.out.println(sb.toString());
 
    }
 
}

●느낀 점

1번은 clockSort 메소드를 이용하여 재귀적으로 호출되어 4개의 방향(오른쪽, 아래, 왼쪽, 위쪽)으로 이동하면서 배열을 채우도록 하였다.

2번은 dx dy 를 이용하여 방향 배열 설정하였고 배열의 경계에 도달하거나 이미 숫자가 있는 위치에 도달하면 방향을 바꾸도록하였다.

1번을 푸는중에 더 간단하게 풀 수 있을 거 같아 2번 처럼 풀어보았다ㅎㅎ...

profile
👩‍💻Backend Engineering

0개의 댓글