본문 바로가기
Problem Solving/SWEA

SWEA-1954 달팽이 숫자

by 채니_ 2021. 2. 6.

좌표 변경후 값 입력을 재귀함수를 이용하였다.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Snail {
	//오른 아래 왼쪽 위에
	static int N,stop;
	static int	[][]arr;
	static boolean 	[][] visit;
	public static void main(String[] args) throws FileNotFoundException {
		
		System.setIn(new FileInputStream("input/snail.txt"));
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		
		for (int tc = 1; tc <=T ; tc++) {
			
			N = sc.nextInt();
			
			stop = N*N;
			arr = new int [N][N];
			visit = new boolean[N][N];
			arr[0][0]=1;
			visit[0][0]= true;
			
			move(0,0,2);
			
			System.out.printf("#%d\n",tc);
			//달팽이 출력
			for (int k = 0; k < N; k++) {
				for (int k2 = 0; k2 < N; k2++) {
					System.out.printf(arr[k][k2]+" ");
				}System.out.println();
			}
		}

	}
	private static void move(int r, int c, int cnt) {
		if (cnt > stop)
			return;
		
		for (int i = 1; i <= N; i++) {//우
			if (c + i < N && visit[r][c + i] == false) {
				arr[r][c + i] = cnt;
				visit[r][c + i] = true;
				cnt++;
			} else {
				c = c + i - 1;
				break;
			}
		}
		for (int i = 1; i <= N; i++) {//하
			if (r + i < N && visit[r + i][c] == false) {
				arr[r + i][c] = cnt;
				visit[r + i][c] = true;
				cnt++;
			} else {
				r = r + i - 1;
				break;
			}
		}
		for (int i = 1; i <= N; i++) {//좌
			if (c - i >= 0 && visit[r][c - i] == false) {
				arr[r][c - i] = cnt;
				visit[r][c - i] = true;
				cnt++;
			} else {
				c = c - i + 1;
				break;
			}
		}
		for (int i = 1; i <= N; i++) {//상
			if (r - i >= 0 && visit[r - i][c] == false) {
				arr[r - i][c] = cnt;
				visit[r - i][c] = true;
				cnt++;
			} else {
				r = r - i + 1;
				break;
			}
		}
		move(r, c, cnt);
	}

}

 

기저조건은 cnt(입력할 값)이 stop(N*N, 현재에서는 9)를 넘으면 재귀함수를 빠져나오도록 설정하였다.

 

우,하,좌,상 순서로 동작하며 한번의 재귀(우하좌상)이 끝났을 경우 다시 재귀함수를 실행하도록 설정.

 

좌표값 r,c 와 배열에 찍을 숫자인 cnt를 인자로 가져감.

 

조건에 맞지 않아 반복문을 탈출하였을 땐, 그 좌표가 아니므로 r,c,값을 다시 조정하여 인자에 입력

'Problem Solving > SWEA' 카테고리의 다른 글

SWEA- 5215 햄버거 다이어트  (0) 2021.02.06
SWEA-1218 괄호 짝짓기  (0) 2021.02.06
SWEA-1247 최적 경로  (0) 2021.02.06
SWEA-1210 Ladder 1  (0) 2021.02.06
[SWEA] 1289 원재의 메모리 복구하기  (0) 2021.02.06

댓글