[SWEA] 1954

ninano05·2026년 3월 31일

달팽이 숫자

  • 달팽이 집은 이차원 배열 빈공간으로 주어진다.
  • 달팽이 집의 각 칸을 방문하며 숫자를 넣어준다.
  • 달팽이 집 이동은 오른쪽 -> 아래 -> 왼쪽 -> 위 순서이다.
  • 방향을 바꾸는 법칙은 배열의 끝에 도달하거나, 이미 숫자가 채워진 칸이면 방향을 바꾸도록 한다.
  • 오른쪽: 열에 1을 더한다
  • 아래: 행에 1을 더한다
  • 왼쪽: 열에 1일 뺀다
  • 위: 행에 1을 뺀다

내가 작성한 코드

import java.util.*;
import java.io.*;

public class Main {

    public static void main(String[] args) throws Exception {
        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());
        // 오른쪽(0,1) 아래(1,0) 왼쪽 (0,-1) 위(-1, 0)
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};

        int[][] snail;

        for(int i=0; i<T; i++) {
            int N = Integer.parseInt(br.readLine());
            snail = new int[N][N]; // 달팽이 배열 생성
            int cur = 1; // 넣어줄 숫자 값
            int row = 0; // 넣어줄 위치 행
            int col = 0; // 넣어줄 위치 열
            int dir = 0; // 움직을 방향 결정 (0:오른쪽, 1:아래, 2:왼쪽, 3:위)

            for(int j=0; j< N*N; j++) {
                snail[row][col] = cur;
                cur++;

                // 다음으로 이동 자리
                int nrow = row + dx[dir];
                int ncol = col + dy[dir];
                //방향 전환 필요한지 확인
                if(nrow < 0 || nrow >= N || ncol < 0 || ncol >= N || snail[nrow][ncol] != 0) {
                    dir = (dir+1)%4; // 항상 0~3만 순서대로 나오도록
                    // 새로 전환한 방향으로 이동
                    nrow = row + dx[dir];
                    ncol = col + dy[dir];
                }
                // 다음 자리 확정
                row = nrow;
                col = ncol;
            }
            sb.append("#").append(i+1).append("\n");
            for(int o=0; o<N; o++) {
              for(int p=0; p<N; p++) {
                  sb.append(snail[o][p]).append(" ");
              }
              sb.append("\n");
            }
        }
        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }
}

정답 코드

public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringBuilder sb = new StringBuilder();
        int[][] snail;

        // 오른쪽, 아래, 왼쪽, 위 순서
        int[] dx = {0, 1, 0, -1}; //행
        int[] dy = {1, 0, -1, 0}; //열
        int T = Integer.parseInt(br.readLine());

        for(int i=0; i<T; i++) {
            int n = Integer.parseInt(br.readLine());
            snail = new int[n][n];
            int x = 0; // 현재 행 위치
            int y = 0; // 현재 열 위치
            int dir = 0; // 진행 방향

            for(int cur=1; cur <= n*n; cur++) {
                snail[x][y] = cur;

                int nx = x + dx[dir];
                int ny = y + dy[dir];

                // 방향 바꾸기
                if(nx < 0 || nx >= n || ny < 0 || ny >= n || snail[nx][ny] != 0) {
                    dir = (dir + 1) % 4;
                    nx = x + dx[dir];
                    ny = y + dy[dir];
                }

                x = nx;
                y = ny;
            }
            sb.append("#").append(i+1).append("\n");
            for(int sx=0; sx<n; sx++) {
                for(int sy=0; sy<n; sy++) {
                    sb.append(snail[sx][sy]).append(" ");
                }
                sb.append("\n");
            }
        }

        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }
profile
초보 개발자

0개의 댓글