문제:
n * m크기의 직사각형에 숫자 1부터 순서대로 증가시키며 달팽이 모양으로 채우는 코드를 작성해보세요.
달팽이 모양이란 왼쪽 위 모서리에서 시작해서, 오른쪽, 아래쪽, 왼쪽, 위쪽 순서로
더 이상 채울 곳이 없을 때까지 회전하는 모양을 의미합니다.
n : 행(row), m : 열(column)을 의미합니다
코드:
import java.util.*;
public class Main {
public static int n;
public static int m;
public static int x = 0;
public static int y = 0;
public static int [] dx = new int[]{0,1,0,-1};
public static int [] dy = new int[]{1,0,-1,0};
public static boolean inRange(int x, int y) {
return (0 <= x && x < n) && (0 <= y && y < m);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
int [][] arr = new int[n][m];
int dirNum = 0;
arr[0][0] = 1;
for(int i=2;i<=n*m;i++) {
int nx = x+dx[dirNum];
int ny = y+dy[dirNum];
if(!inRange(nx,ny) || arr[nx][ny] != 0) {
dirNum = (dirNum+1)%4;
}
x= x+dx[dirNum];
y= y+dy[dirNum];
arr[x][y] = i;
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
'Java > 실습' 카테고리의 다른 글
[Java] 배열 임의의 위치 원소 추가/제거 메서드 구현 (0) | 2022.07.20 |
---|---|
[Java] 되돌아오기 2 (0) | 2022.07.19 |
[Java] 부분 문자열 찾기 (0) | 2022.07.18 |
[Java] 잔해물을 덮기 위한 사각형의 최소 넓이 (0) | 2022.07.17 |
[Java] 요일 맞추기 (0) | 2022.07.17 |