첫째 줄에 네 정수 r1, c1, r2, c2가 주어진다.
r2 - r1 + 1개의 줄에 소용돌이를 예쁘게 출력한다.
예쁘게 출력한다는 것은 다음과 같이 출력하는 것이다.
우선 이차원 배열 만들고
dx,dy 일차원 배열 만드는거까지는 당연한 과정
isFinish
함수를 이용해서 배열의 모든 값을 채웠는지 확인하며
방향 전환하며 배열 값 채워나가기
여기서 함정은 출력 형식이었다.
그냥 공백으로 출력하면 안되고 위의 조건들은 만족해야해서
formatter
를 통해 처리했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] map;
static int r1, c1, r2, c2, max = 0;
static int[] dx = {0, -1, 0, 1};
static int[] dy = {1, 0, -1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
r1 = Integer.parseInt(st.nextToken());
c1 = Integer.parseInt(st.nextToken());
r2 = Integer.parseInt(st.nextToken());
c2 = Integer.parseInt(st.nextToken());
map = new int[r2 - r1 + 1][c2 - c1 + 1];
fill();
StringBuilder formatter = new StringBuilder("%");
formatter.append(String.valueOf(max).length());
formatter.append("d ");
for (int i = 0; i <= r2 - r1; i++) {
for (int j = 0; j <= c2 - c1; j++) {
System.out.printf(formatter.toString(), map[i][j]);
}
System.out.println();
}
}
private static void fill() {
int x = 0, y = 0, dir = 0;
int num = 1, dnum = 1, cnt = 0;
while (!isFinish()) {
if (x >= r1 && x <= r2 && y >= c1 && y <= c2) {
map[x - r1][y - c1] = num;
}
num++;
cnt++;
x = x + dx[dir];
y = y + dy[dir];
if (cnt == dnum) {
cnt = 0;
if (dir == 1 || dir == 3) dnum++;
dir = (dir + 1) % 4;
}
}
max = num - 1;
}
private static boolean isFinish() {
return map[0][0] != 0 && map[r2 - r1][0] != 0 && map[0][c2 - c1] != 0 && map[r2 - r1][c2 - c1] != 0;
}
}