본문 바로가기
코딩테스트 준비/SWEA

[SWEA] 1954번 - 달팽이 숫자 [Java]

by mwzz6 2025. 2. 12.

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

 

[SWEA] 1954번 - 달팽이 숫자 [Java]
[SWEA] 1954번 - 달팽이 숫자 [Java]
[SWEA] 1954번 - 달팽이 숫자 [Java]


1.  아이디어

 

달팽이의 위치와 방향을 변수로 관리하고 while문과 방향 배열을 조합해서 해결했다.


2. 문제풀이

 

달팽이의 위치와 방향, 달팽이가 적을 숫자를 r, c, d, num 변수로 관리하고 시계 방향으로 방향 배열을 작성했다. 달팽이가 모든 수를 적을 때까지 반복하며 다음 위치가 맵의 밖이거나 숫자가 적힌 칸이면 방향을 변경하도록 했다.


3. 코드

 

import java.io.*;

public class Solution {

    private static final int[] dr = {-1, 0, 1, 0};
    private static final int[] dc = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
//        BufferedReader br = new BufferedReader(new InputStreamReader(Solution.class.getResourceAsStream("input.txt")));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());
        for (int tc = 1; tc <= T; tc++) {
            int N = Integer.parseInt(br.readLine());

            int[][] map = new int[N][N];
            int r = 0;
            int c = 0;
            int d = 0;
            int num = 1;

            while (num <= N * N) {
                map[r][c] = num;

                if ((r + dr[d] < 0) || (r + dr[d] >= N) || (c + dc[d] < 0) || (c + dc[d] >= N)) d++;
                else if (map[r + dr[d]][c + dc[d]] != 0) d++;

                d %= 4;
                r += dr[d];
                c += dc[d];
                num++;
            }

            sb.append("#").append(tc).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");
            }
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

4. 후기