SWEA 1954 - 달팽이 숫자

Updated:

Java

1954 번 - 달팽이 숫자

문제

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

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

N이 3일 경우,

N이 4일 경우,

접근 방법

오른쪽을 방향으로 이동하기 시작하여, 만약 범위를 벗어나거나 이미 방문한 위치면 방향을 바꾼다.
[우 -> 하 -> 좌 -> 상]으로 반복하다 보면 달팽이가 완성된다.
범위를 벗어나거나, 이미 방문한 위치면 방향을 바꾸되, 방향 인덱스가 [1, 2, 3, 4]이므로 modulo 4를 하여 방향을 바꾸어 준다.

구현

N*N 크기만큼 반복을 한다.
[0, 0]에서 우/하/좌/상을 나타내는 배열을 통하여 하나씩 더해가며 이동을한다.
이미

코드

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

class Solution {
	public static void main(String []args) throws Exception {  
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int result = 0;
    	StringTokenizer st;
    	int tc = stoi(br.readLine());
    	
    	int dy[] = {0, 1, 0, -1};		// 우 하 좌 상 
    	int dx[] = {1, 0, -1, 0};
    	
    	for(int idx = 1; idx <= tc; idx++) {
    		int n = stoi(br.readLine());
    		int arr[][] = new int[n][n];
    		int cnt = 1, dir = 0, x = 0, y = 0;
    		// 달팽이 시작
    		while(cnt != (Math.pow(n, 2) + 1)) {		// N^2 만큼 작성 될 때 까지 반복
    			arr[y][x] = cnt;
    			// 만약 범위를 벗어나거나, 이미 방문한 위치면
    			if(y + dy[dir] < 0 || y + dy[dir] >= n || x + dx[dir] < 0 || x + dx[dir] >= n || arr[y+dy[dir]][x+dx[dir]] != 0) {
    				dir = (dir + 1) % 4;				// 방향을 바꾼다.
    			}
    			y += dy[dir];
    			x += dx[dir];
    			
    			cnt++;
    		}
    		
    		System.out.println("#" + idx);
    		for(int[] a : arr) {
    			for(int b : a) {
    				System.out.print(b + " ");
    			}
    			System.out.println();
    		}
    	}
	}
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐★★★★

후기

달팽이는 빙빙빙

개선할 점

빙빙빙