좌표 변경후 값 입력을 재귀함수를 이용하였다.
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 |
댓글