SWEA 1954. 달팽이 숫자

이상민·2023년 10월 31일
0

알고리즘

목록 보기
85/128
import java.util.Scanner;

public class SnailNumber {
    static int[] dr = {0,1,0,-1};
    static int[] dc = {1,0,-1,0};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            int N = sc.nextInt();
            int[][] map = new int[N][N];
            int num = 1;
            int row = 0;
            int col =0;
            int index = 0;
            int dir=0;
            map[0][0] = num;
            num++;
            while (true){
                if(num>N*N)
                    break;
                dir = index%4;

                int nrow = row + dr[dir];
                int ncol = col + dc[dir];
                if(nrow>=N||ncol>=N||nrow<0||ncol<0){
                    index++;
                }
                else if(map[nrow][ncol]==0){
                    map[nrow][ncol] = num;
                    row = nrow;
                    col = ncol;
                    num++;
                }
                else {
                    index++;
                }
            }
            StringBuilder sb = new StringBuilder();
            sb.append("#").append(" ").append(test_case).append("\n");
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    sb.append(map[i][j]).append(" ");
                }
                sb.append("\n");
            }
            System.out.println(sb);
        }
    }
}

풀이방법

  1. 초기값 num을 map[0][0]에 넣어주고, while문을 통해 map을 탐색한다.
  2. map밖을 탐색하거나, 이미 채워진 수를 만나면, dir = index%4을 통해 방향을 전환한다.
  3. 빈칸이라면 map에 num을 넣고, 해당 칸이 현재 칸이 된다.
  4. num이 N*N보다 커지면 while문을 탈출하고, 출력한다.

후기

예전에는 비슷한문제를 dfs로 푼적도 있고, 상하좌우 for문 4개를 통해 푼적도 있는데,
이 코드가 제일 정석적인것 같다. 예전 코드는 어거지로 푸는 느낌이 있다.

profile
개린이

0개의 댓글