SWEA1954_달팽이 숫자
문제
접근
- 모양은 유지된 채 N값에 따라 크기가 변함
- 규칙을 찾아 구현하는 문제
- 달팽이 문제 같은 경우에 규칙이 복잡하기에 구현하는데 시간이 오래 걸렸다.
풀이 방법(개인적인 생각 + 추후 더 좋은 방법이 있으면 개선)
-
규칙을 찾는게 우선(방향 + 반복 개수)
- 맨 처음 진행할 때 한번 N개 숫자(우 방향)가 채워지고, 그 다음에는 N-1개의 숫자가 2번(하,좌) 채워진다.
- 그 다음에는 N-2개의 숫자가 2번(상,우) 채워진다.
- 그 다음에는 N-3개의 숫자가 2번(하,좌) 채워진다.
-
… 이렇게 1개의 숫자가 2번 채워지고 끝이 난다.
- 고려해야 할 사항
- 달팽이가 바깥에서 안으로 채워짐에 따라 N값이 점점 작아지게 유도
- 2번씩 반복
- 상,하,좌,우 바뀌는 방향
느낀점
- 특정 패턴이나 규칙이 반복되는 문제들(별찍기, 다이아몬드 찍기 등)을 많이 풀어보며 시뮬의 기본기를 다져야겠다.
- 게리맨더링2, 배열돌리기, 원판돌리기 등 삼성코테에서는 시뮬 문제는 무조건 나온다.
풀이 코드
package samsung;
import java.util.Scanner;
public class 달팽이 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int tc = scan.nextInt();
for (int t = 1; t <= tc; t++) {
int N = scan.nextInt();
int[][] arr = new int[N][N];
int row = 0;
int col = -1;
int dir = 1;
int count = 1;
int size = N*N;
while(count <= size) {
for (int i = 0; i < N; i++) {
col += dir;
arr[row][col] = count++;
}
N--;
for (int i = 0; i < N; i++) {
row += dir;
arr[row][col] = count++;
}
dir *= (-1);
}
System.out.println("#" + t);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
}