조건
- 방향 전환의 조건
- 경계를 넘어갈 때 방향 전환
- 이미 숫자가 채워져 있으면 방향 전환
- 방향 변환의 규칙
- 오른쪽 → 아래 → 왼쪽 → 위
- 종료 조건
- 값이 N*N이 되면 종료
package com.algorithm.swea;
import java.util.Scanner;
public class Solution_1954 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++){
int N = sc.nextInt();//달팽이의 크기
int[][] data = new int[N][N];
int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
boolean[][] check = new boolean[N][N];//방문 여부 확인
int nowRow = 0, nowCol = 0;//현재 행,열 위치
int num = 1;
data[0][0] = num++;
check[0][0] = true;
int i = 0;
while(true) {
if(num > N*N) {
break;
}
while(true) {
if(nowRow + dir[i][0] >= N || nowCol + dir[i][1] >= N || nowRow + dir[i][0] < 0 || nowCol + dir[i][1] < 0 || check[nowRow + dir[i][0]][nowCol + dir[i][1]]) {
break;
}
if(!check[nowRow + dir[i][0]][nowCol + dir[i][1]]) {//방문하지 않은 경우
data[nowRow + dir[i][0]][nowCol + dir[i][1]] = num++;
check[nowRow + dir[i][0]][nowCol + dir[i][1]] = true;
nowRow = nowRow + dir[i][0];
nowCol = nowCol + dir[i][1];
}
}
i = (i + 1) % 4;//방향 전환
}
System.out.println("#" + test_case);
for(int l = 0; l < N; l++) {
for(int k = 0; k < N; k++) {
System.out.printf("%d ", data[l][k]);
}
System.out.println();
}
}//end for
sc.close();
}
}
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA] 자바 1249. [S/W 문제해결 응용] 4일차 - 보급로 (0) | 2022.10.02 |
---|---|
[SWEA] 2382번 미생물 격리 - 자바 (0) | 2022.09.29 |
[SWEA] 4008번 [모의 SW 역량테스트] 숫자 만들기 - 자바 (0) | 2022.09.14 |
[SWEA] 7465 창용 마을 무리의 개수 - 자바 (0) | 2022.08.24 |
[SWEA] 자바 1247 최적경로 (0) | 2022.08.21 |