본문 바로가기
Algorithm(알고리즘)/SWEA(SW Expert Academy)

[SWEA][Java][D2] 1954 - 달팽이 숫자

by Jun_N 2021. 1. 24.

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


문제 풀이

해당 문제는 1씩 증가하면서 오른쪽 아래 왼쪽 위 를 반복하는 달팽이 문제이다.

 

이 문제를 풀때 4가지의 반복문 (오른쪽 아래 왼쪽 위)의 규칙을 찾아서 반복시켜줬고 visitied라는 boolean 배열을 만들어서 이전에 갔던 곳인지 체크해주었다.

 

여기서 (int)Math.ceil((double)N/2) 만큼 반복해주는데 3~4일때는 2번 , 5~6일때는 3번, 식으로 반복되기 때문이다.

Math.ceil은 소수점 올림을 하는 방식인데 안에가 double이여야 돼서 형변환을 해줘야 한다.

 

import java.util.Arrays;
import java.util.Scanner;

public class D2_1954 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();

		for (int tc = 1; tc <= T; tc++) {
			int N = sc.nextInt();
			int[][] map = new int[N][N];
			boolean[][] visited = new boolean[N][N];
			int value = 0;
			for (int i = 0; i < (int) Math.ceil((double) N / 2); i++) {
				// 위에 가로
				for (int j = 0; j < N; j++) {
					if (!visited[i][j]) {
						map[i][j] = ++value;
						visited[i][j] = true;
					}
				}
				// 오른쪽 세로
				for (int j = 1; j < N; j++) {
					if (!visited[j][N - i - 1]) {
						map[j][N - i - 1] = ++value;
						visited[j][N - i - 1] = true;
					}
				}

				// 아래 가로
				for (int j = 1; j < N; j++) {
					if (!visited[N - 1 - i][N - 1 - j]) {
						map[N - 1 - i][N - 1 - j] = ++value;
						visited[N - 1 - i][N - 1 - j] = true;
					}
				}

				// 왼쪽 세로
				for (int j = 1; j < N; j++) {
					if (!visited[N - j - 1][i]) {
						map[N - j - 1][i] = ++value;
						visited[N - j - 1][i] = true;
					}
				}
			}
			System.out.printf("#%d\n", tc);
			for (int k = 0; k < N; k++) {
				for (int p = 0; p < N; p++) {
					System.out.print(map[k][p] + " ");
				}
				System.out.println("");
			}
		}

	}

}

 


배운점

 

1. 

Math.ceil()을 할때 double값이 들어가야 한다.

 

형변환 (double) 하는 것을 잊지 않도록 하자.

 

 

2. 

visited[] 는 DFS, BFS에서도 자주 사용되니까 2차원 배열을 할때 한번쯤 고려해 보자.