[SWEA] 1954 달팽이

KwangYong·2022년 8월 3일
0

SWEA

목록 보기
1/17
import java.util.Scanner;

public class Solution{

	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[][] map = new int[n][n];
			int cur = 1;
			int dx[] = { 0, 1, 0, -1 };
			int dy[] = { 1, 0, -1, 0 };

			// 홀수일 때, n / 2 바퀴 돌고 마지막 한개(n % 2) 채움
			int x = 0, y = 0;

			// 4방향을 모두 돌았을 때 전체 한바퀴이며
			// 한 방향은 n-1개만큼 진행한다.
			for (int k = 0; k < n / 2; k++) {
				for (int dir = 0; dir < 4; dir++) { // 4방향
					for (int unit = 0; unit < n - 1 - (k * 2); unit++) {// 한방향 진행 개수
						map[x][y] = cur++;
						x += dx[dir];
						y += dy[dir];
					}
				} // 한바퀴를 다 돌았으면.. 바퀴 시작점으로 갔을테니까
					// x+1, y+1로 가야되고
					// 한방향 개수도 -2 줄어야함.
				x += 1;
				y += 1;
			}
			// 홀수일때 마지막 한개를 맵의 한가운데에 넣는다.
			// 바퀴 돌고 나서 각각 +1 해주고 끝났으니까 그대로 넣는다
			if(n % 2 == 1) {
				map[x][y] = cur;				
			}

			// 짝수일 때, n / 2바퀴 돌고 끝임.

			System.out.println("#" + t);
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					System.out.print(map[i][j] + " ");
				}
				System.out.println();
			}
		}

	}

}

설명

전체 몇바퀴 도는지, 한 바퀴 안의 한 방향이 몇 칸 진행되는지를 n과 연결지어 생각한다. 해당 칸이 진행되면 방향을 바꿔서 총 4방향이 필요하다.
예를 들어 n이 3일 때, 한 방향씩 2칸을 진행하며 그 후에 방향을 바꿔서 진행한다. 근데 배열에 원소 삽입할 때, 방향을 바꾸기 전 방향으로 먼저 삽입하기 때문에 반복문이 끝나고 나면 위치는 해당 바퀴가 돌았던 시작 위치로 가게 된다.
그래서 반복문이 끝나면 x, y에 각각 1을 더 해줌으로써 안쪽 위치로 가게 된다. 또한 한 방향의 진행(unit)은 -2만큼씩 더 줄어들게 된다.

profile
바른 자세로 코딩합니다 👦🏻💻

0개의 댓글