문제 풀이
해당 문제는 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차원 배열을 할때 한번쯤 고려해 보자.
'Algorithm(알고리즘) > SWEA(SW Expert Academy)' 카테고리의 다른 글
[SWEA][Java][D4][최소 신장 트리,크루스칼] 1251 - 하나로 (0) | 2021.03.29 |
---|---|
[SWEA][Java][D3][시물레이션] 1873 - 상호의 배틀필드 (0) | 2021.02.03 |
[SWEA][Java][D2] 1204 - [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2021.01.26 |
[SWEA][Java][D2] 1983 - 조교의 성적 매기기 (HashMap) (0) | 2021.01.18 |
[SWEA][Java][D2] 2001 - 파리 퇴치 (0) | 2021.01.17 |