반응형
출처: SWEA
Input
2
3
4
Output
#1
1 2 3
8 9 4
7 6 5
#2
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
N이 주어졌을 때, 방향이 바뀌는 시점과 채워지는 값에 유의하며 구현
- 방향이 바뀌는 시점: 벽면이거나, 이미 숫자가 채워진 경우
- 채워지는 값: 1~N*N
import java.util.Scanner;
public class Solution {
// 달팽이 모양을 그릴 수 있도록 우,하,좌,상
static public int[] dx = {0, 1, 0, -1};
static public int[] dy = {1, 0, -1, 0};
static public int N;
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
// TestCase
int tc = Integer.parseInt(sc.next());
int probNo = 1;
while (tc-- > 0) {
N = Integer.parseInt(sc.next());
System.out.println("#" + (probNo++));
printMap(makeSnail());
}
}
private static void printMap(int[][] map) {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
private static int[][] makeSnail() {
int[][] map = new int[N][N];
int i = 1;
Vertex v = new Vertex(0, 0);
int dir = 0;
while(true) {
// 배열 원소값 할당
map[v.x][v.y] = i++;
if(i > N * N) break;
// 다음 좌표
int nX = v.x + dx[dir];
int nY = v.y + dy[dir];
// 배열의 범위를 벗어나면 방향을 바꾼다. (외곽 테두리)
if(nX < 0 || nY < 0 || nX >= N || nY >= N ) {
dir = changeDir(dir);
nX = v.x + dx[dir];
nY = v.y + dy[dir];
}
// 기존의 이미 숫자를 만들어진 곳이라면 방향을 바꾼다. (내부로 탐색 과정에서...)
// (Java) 2차원 배열 원소 초기값 = 0 이용.
if(map[nX][nY] != 0) {
dir = changeDir(dir);
nX = v.x + dx[dir];
nY = v.y + dy[dir];
}
// 다음 Spot으로 좌표 이동
v.x = nX;
v.y = nY;
}
return map;
}
private static int changeDir(int dir) {
return (dir + 1) % 4;
}
}
class Vertex{
int x, y;
public Vertex(int x, int y) {
this.x = x;
this.y = y;
}
}
반응형
'PS 문제 풀이 > SWEA' 카테고리의 다른 글
[SWEA] 8382 방향 전환 (0) | 2021.03.01 |
---|---|
[SWEA] 1974 스도쿠 검증 (0) | 2021.03.01 |
[SWEA] 3816 아나그램 (0) | 2021.03.01 |
[SWEA] 3819 최대 부분 배열 (0) | 2021.02.28 |
[SWEA] 2814 최장경로 (0) | 2021.02.27 |
댓글