-
1954. 달팽이 숫자 - 자바(JAVA)알고리즘/SW Expert Academy 2022. 2. 21. 00:01반응형
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq
문제 해석
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()); } }
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
1940. 가랏! RC카! (0) 2022.02.24 2805. 농작물 수확하기 - 자바(JAVA) (0) 2022.02.24 2001. 파리 퇴치 - 자바(JAVA) (0) 2022.02.23 1873. 상호의 배틀필드 - 자바(JAVA) (0) 2022.02.22 1289. 원재의 메모리 복구하기 - 자바(JAVA) (0) 2022.02.18