[JAVA] SWEA (D2) 1954. 달팽이 숫자

AIR·2023년 11월 18일
0

링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&problemLevel=3&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=INQUERY_COUNT&selectCodeLang=JAVA&select-1=3&pageSize=10&pageIndex=1


문제 설명

(정답률 71.57%)
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.


입력 예제

2
3
4


출력 예제

#1
1 2 3
8 9 4
7 6 5
#2
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7


정답 코드

3x3의 배열을 인덱스로 나타내면 다음과 같다
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
시계 방향으로 회전하려면 인덱스는

  • 행 고정, 열 1씩 증가
  • 행 1씩 증가, 열 고정
  • 행 고정, 열 1씩 감소
  • 행 1씩 감소, 열 고정

4가지 과정을 거쳐야한다.
단, 각 꼭짓점에서 방향을 전환해주고 방문한 원소에서 역시 방향을 전환해준다.

import static java.lang.System.lineSeparator;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

class SWEA {
    
    public static void main(String[] args) throws IOException {

        System.setIn(new FileInputStream("src/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        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};


        for (int test_case = 1; test_case <= T; test_case++) {
             
            StringBuilder sb = new StringBuilder();
            int n = Integer.parseInt(br.readLine());
            int[][] result = new int[n][n];
            int dir = 0;
            int r = 0, c = 0;

            for (int i = 1; i <= n * n; i++) {
                    result[x][y] = i;
                    int nextX = x + dx[direction];
                    int nextY = y + dy[direction];
                    //다음 행과 열에 대하여
                    if (nextX >= n || nextX < 0 //행의 처음과 끝일 때
                            || nextY >= n || nextY < 0  //열의 처음과 끝일 때
                            || result[nextX][nextY] != 0)   //방문한 원소일 때
                    {
                        direction = (direction + 1) % 4;    //방향 전환
                    }
                    x += dx[direction];
                    y += dy[direction];
                }

                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < n; j++) {
                        sb.append(result[i][j]).append(" ");
                    }
                    sb.append(lineSeparator());
                }

                System.out.print("#" + test_case + lineSeparator() + sb);
        }
    }
}

정리

2차원 배열의 방향을 전환하면서 푸는 문제는 처음이라 낯설고 어려웠다.
D2이고 정답률이 높은데 뭔가 잘못된거 같다..

profile
백엔드

0개의 댓글