728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq
문제
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
풀이
달팽이의 순서는 우->하->좌->상 으로 정해져 있으므로, dx와 dy의 값을 순서에 맞게 정의한다.
이때 숫자는 총 N*N까지 출력되기 때문에 N*N번만큼 반복문을 돌리고, 배열의 범위를 벗어나거나 갈 자리에 이미 숫자가 있다면, 방향을 바꿔준다.
이때 dx,dy 의 인덱스 0,1,2,3을 차례로 반복해야 하므로 나머지 연산을 통해 진행한다.
소스코드
import java.util.Scanner;
/*
* n*n 배열에 달팽이 모양으로 숫자 찍기
* SWEA 1954. 달팽이 숫자
*/
public class SWEA1954_달팽이숫자 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tc = sc.nextInt();
for (int t = 1; t <= tc; t++) {
int N = sc.nextInt();
int arr[][] = new int[N][N];
int dx[] = { 0, 1, 0, -1 }, dy[] = { 1, 0, -1, 0 }; //우,하,좌,상
int count = 1;
int x = 0, y = 0;
int d = 0;
while (count <= N * N) {
arr[x][y] = count++;
int nx = x + dx[d];
int ny = y + dy[d];
if (nx < 0 || nx >= N || ny < 0 || ny >= N || arr[nx][ny] != 0) { //경계 벗어나거나, 숫자가 이미 존재하면
d = (d + 1) % 4; //방향바꿈
nx = x + dx[d];
ny = y + dy[d];
}
x = nx;
y = ny;
}
System.out.printf("#%d\n",t);
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++)
System.out.print(arr[r][c] + " ");
System.out.println();
}
}
}
}
728x90
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA2805_농작물수확하기 (0) | 2022.03.16 |
---|---|
[Java] SWEA1873_상호의배틀필드 (0) | 2022.03.16 |
[Java] SWEA1208_Flatten (0) | 2022.03.16 |
[Java] SWEA2001_파리퇴치 (0) | 2022.03.16 |
[Java] SWEA1289_원재의메모리복구하기 (0) | 2022.03.12 |
댓글