728x90
⬛ 1954. 달팽이 숫자
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&
⬛ 풀이 방법
- 배열이 채워지는 순서가 우->하->좌->상으로 반복
- 배열의 끝을 만나거나 이미 채워진 부분을 만났을 때 방향이 바뀐다.
- 채워지는 수인 num이 배열의 크기가 되었을 때까지 반복
⬛ 소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 달팽이숫자 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
int[] dx = { 1, 0, -1, 0 };
int[] dy = { 0, 1, 0, -1 }; //우하좌상
for (int tc = 1; tc <= T; tc++) {
sb.append("#" + tc + "\n");
int num = 1;
int N = Integer.parseInt(br.readLine());
int arr[][] = new int[N][N];
int x = 0, y = 0;
int dir = 0;
while(num <= (N * N)) {
arr[y][x] = num++;
x += dx[dir];
y += dy[dir];
if(x > N-1 || x < 0 || y > N-1 || y < 0 || arr[y][x] != 0) { //배열의 끝을 만나거나 이미 채워진 부분을 만났을 때
x-=dx[dir];
y-=dy[dir]; //이전 자리로 다시 가고
dir = (dir+1)%4; //방향을 바꿔줌 //우하좌상이 반복될 수 있게 함
x+=dx[dir]; //바뀐 방향으로 이동
y+=dy[dir];
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
sb.append(arr[i][j] + " ");
}
sb.append("\n");
}
}
System.out.println(sb.toString());
}
}
728x90
'공부의 기록 > SWEA' 카테고리의 다른 글
[SWEA] 1210. [S/W 문제해결 기본] 2일차 - Ladder1 - java (0) | 2022.02.23 |
---|---|
[SWEA] 1289. 원재의 메모리 복구하기 - java (0) | 2022.02.04 |