문제

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();
			}
			
		}
		
	}
}

출력화면