https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq
1. 아이디어
달팽이의 위치와 방향을 변수로 관리하고 while문과 방향 배열을 조합해서 해결했다.
2. 문제풀이
달팽이의 위치와 방향, 달팽이가 적을 숫자를 r, c, d, num 변수로 관리하고 시계 방향으로 방향 배열을 작성했다. 달팽이가 모든 수를 적을 때까지 반복하며 다음 위치가 맵의 밖이거나 숫자가 적힌 칸이면 방향을 변경하도록 했다.
3. 코드
import java.io.*;
public class Solution {
private static final int[] dr = {-1, 0, 1, 0};
private static final int[] dc = {0, 1, 0, -1};
public static void main(String[] args) throws IOException {
// BufferedReader br = new BufferedReader(new InputStreamReader(Solution.class.getResourceAsStream("input.txt")));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
int N = Integer.parseInt(br.readLine());
int[][] map = new int[N][N];
int r = 0;
int c = 0;
int d = 0;
int num = 1;
while (num <= N * N) {
map[r][c] = num;
if ((r + dr[d] < 0) || (r + dr[d] >= N) || (c + dc[d] < 0) || (c + dc[d] >= N)) d++;
else if (map[r + dr[d]][c + dc[d]] != 0) d++;
d %= 4;
r += dr[d];
c += dc[d];
num++;
}
sb.append("#").append(tc).append("\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(map[i][j]).append(" ");
}
sb.append("\n");
}
}
bw.write(sb.toString());
bw.flush();
}
}
4. 후기
'코딩테스트 준비 > SWEA' 카테고리의 다른 글
[SWEA] 2005번 - 파스칼의 삼각형 [Java] (0) | 2025.02.13 |
---|---|
[SWEA] 2068번 - 최대수 구하기 [Java] (0) | 2025.02.13 |
[SWEA] 2063번 - 중간값 찾기 [Java] (0) | 2025.02.13 |
[SWEA] 1966번 - 숫자를 정렬하자 [Java] (0) | 2025.02.13 |
[SWEA] 14229번 - 백만 개의 정수 정렬 [Java] (0) | 2025.02.12 |