알고리즘/SWExpert알고리즘

[SWEA] D2 - 1954번 달팽이 문제

Fenderblue 2023. 4. 29. 20:30

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

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

2차원 배열에 달팽이 등껍질 모양처럼 1부터 N*N까지의 수를 나선형을 돌듯이 채워 이를 출력하는 문제이다.

오른쪽, 아래, 왼쪽,위 방향으로 반복되는 형태이므로 좌표값을 방향에 맞게 할당되도록 해서 풀었다.

들어갈 값이 N*N이 될때까지 위의 과정이 반복되므로 크게 while문으로 감싸고

그 안에서 또 각각 while문으로 진행되도록 했다.

오른쪽으로 가려면 y값을 증가시키고, 밑으로 가려면 x값을 증가시키고, 왼쪽으로 가려면 y값을 감소시키고, 위로 가려면 x값을 감소시킴.

배열범위 바깥이거나 이미 값이 있는곳에 다다를경우 다음으로 넘어감.

N이 1이 들어올 경우의 예외처리 따로 해주었다.

 

 

최종코드

 

import java.io.*;

public class Solution {  //달팽이 문제
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int T = Integer.parseInt(br.readLine());

        int N;
        int[][] board;
        int value;

        for (int t = 1; t <= T; t++) {
            N = Integer.parseInt(br.readLine());
            board = new int[N][N];
            value = 1;
            int x=0;  //행
            int y=0;    //열
            while (value <= N * N) {
                if (N == 1) {   //예외처리
                    board[x][y] = value;
                    break;
                }
                //오른쪽 이동
                while (y < N) {
                    if (board[x][y] != 0) { //이전에 값을 넣은 곳까지 도달했다면 빠져나간다
                        break;
                    }
                    board[x][y] = value++;
                    y++;
                }
                //아래쪽 이동
                y--;
                x++;
                while (x < N) {
                    if (board[x][y] != 0) { //이전에 값을 넣은 곳까지 도달했다면 빠져나간다
                        break;
                    }
                    board[x][y] = value++;
                    x++;
                }
                x--;
                y--;
                while (y >= 0) {
                    if (board[x][y] != 0) { //이전에 값을 넣은 곳까지 도달했다면 빠져나간다
                        break;
                    }
                    board[x][y] = value++;
                    y--;
                }
                y++;
                x--;
                while (y < N) {
                    if (board[x][y] != 0) { //이전에 값을 넣은 곳까지 도달했다면 빠져나간다
                        break;
                    }
                    board[x][y] = value++;
                    x--;
                }
                x++;
                y++;

            }
            bw.write("#" + t);
            bw.newLine();
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    bw.write(Integer.toString(board[i][j]));
                    bw.write(" ");
                }
                bw.newLine();
            }
        }
        bw.flush();
        bw.close();
    }
}