ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1954. 달팽이 숫자 - 자바(JAVA)
    알고리즘/SW Expert Academy 2022. 2. 21. 00:01
    728x90

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

     

    SW Expert Academy

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

    swexpertacademy.com

     

    문제 해석

    N이라는 크기가 입력되면 N x N 크기의 배열을 만들고 거기에 오른쪽, 아래, 왼쪽, 위를 기준으로 달팽이 모양을 그리면서 숫자를 증가시키면서 채워 넣습니다.

     

    N=4인 경우

    N=3인 경우

     

    입력

    가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 T개의 N이 주어진다.

     

    제약 조건

    1 <= N <=10

     

    출력

    각 줄은 #t로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.

    t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.

     

    문제 풀이 전 설계

    count=1부터 시작하여 count를 점점 증가시키면서 배열에 값을 채워 넣어야 한다.

    배열의 값을 채울 때는 항상 배열 index 에러를 주의해야 한다.

    이를 방지하기 위해 (N+2) x (N+2)의 visited라는 이름의 boolean 2차원 배열을 만들어 가벽을 세워 확인한다.

    또한 어떤 자리가 숫자가 기록되는 순간 해당 자리에는 새로운 값을 채우면 안 되므로 숫자와 벽을 만난다면 방향을 전환해야 한다.

    방향은 항상 오른쪽 , 아래, 왼쪽, 위 순서로 움직이기 때문에 dy, dx 배열을 만들어서 순차적으로 탐색할 수 있게 한다.

     

    코드

    import java.util.Scanner;
    
    public class SnailNumber {
    	// 오른쪽,아래,왼쪽,위
    	static int[] dy = { 0, 1, 0, -1 };
    	static int[] dx = { 1, 0, -1, 0 };
    	static boolean[][] visited;
    	static int[][] snailBoard;
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner scan = new Scanner(System.in);
    		int T = scan.nextInt();
    		for (int t = 1; t <= T; t++) {
    			int N = scan.nextInt();
    			snailBoard = new int[N][N];
    
    			makeVisited(N);
    			makeVisitedTest(N);
    			makeSnailBoard(N);
    			printResult(N, t);
    		}
    		scan.close();
    	}
    
    	static void makeVisited(int N) {
    		// visited false로 초기화됨
    		// 배열 index 유효 검사를 하기싫어서 N+2로 생성 (가벽을 생성한 느낌)
    		visited = new boolean[N + 2][N + 2];
    		for (int i = 1; i <= N; i++) {
    			for (int j = 1; j <= N; j++) {
    				visited[i][j] = true;
    			}
    		}
    	}
    
    	static void makeVisitedTest(int N) {
    		for (int i = 0; i < N + 2; i++) {
    			for (int j = 0; j < N + 2; j++) {
    				System.out.print(visited[i][j] + " ");
    			}
    			System.out.println();
    		}
    	}
    
    	static void makeSnailBoard(int N) {
    		int y = 1, x = 0, direct = 0, count = 1;
    		while (count <= N * N) {
    			int tempY = y + dy[direct];
    			int tempX = x + dx[direct];
                // 벽과 충돌하거나 이미 기록한 값과 충돌하면 뱡항전환발생
    			if (!visited[tempY][tempX]) {
    				direct = direct + 1;
    				direct = direct > 3 ? 0 : direct;
    				continue;
    			}
    			
    			//유효성 검사 끝
    			y = tempY;
    			x = tempX;
    
    			snailBoard[y - 1][x - 1] = count;
    			visited[y][x] = false;
    			count++;
    		}
    	}
    
    	static void printResult(int N, int t) {
    		StringBuilder sb = new StringBuilder();
    		sb.append("#" + t + "\n");
    
    		for (int i = 0; i < N; i++) {
    			for (int j = 0; j < N; j++) {
    				sb.append(snailBoard[i][j] + " ");
    			}
    			sb.append("\n");
    		}
    		System.out.println(sb.toString());
    	}
    }

    댓글

Designed by Tistory.