개미의 개열시미 프로그래밍

[알고리즘] SWEA 달팽이 숫자 - 자바 본문

알고리즘/SWEA

[알고리즘] SWEA 달팽이 숫자 - 자바

YunHyeok 2022. 2. 3. 20:52
728x90
반응형

 

 

 

[전체 풀이 코드]

import java.util.Arrays;
import java.util.Scanner;

public class 달팽이숫자 {
	static int[] dy = {0, 1, 0, -1};
	static int[] dx = {1, 0, -1, 0};
	static int[][] graph;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T;
		T=sc.nextInt();

		for(int test_case = 1; test_case <= T; test_case++){
			int N = sc.nextInt();
			int y = 0; // 세로
			int x = -1; // 가로
			int num = 0; // 넣을 숫자 ++ 할것
			int cntN = N; // 달팽이
			int move = 0;
			
			graph = new int[N][N];
			while(num < N * N) {
				for(int i =0; i<cntN; i++) {
					y = y + dy[move];
					x = x + dx[move];
					graph[y][x] = ++num;
				}
				move = (move+1) % 4; //move 0으로 초기화 했으니까 1더하기, 4로 나눈 나머지 활용 : while문 4바퀴돌면 다시 원래 0으로 돌아가야 되니까
				if(move%2 == 1) { //나눠질떄마다 1을 빼준다.
					cntN-=1;
				}
			}
			System.out.println("#"+test_case);
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					System.out.print(graph[i][j] + " ");
				}
				System.out.println();
			}
		}
	}

}
  • 예전에 cosPro를 준비하면서 풀어봤던 문제라서 풀이를 떠올리는데 큰 어려움은 없었지만 헷갈리는 부분을 다시 짚었다.
move = (move+1) % 4; //move 0으로 초기화 했으니까 1더하기, 4로 나눈 나머지 활용 : while문 4바퀴돌면 다시 원래 0으로 돌아가야 되니까
if(move%2 == 1) { //나눠질떄마다 1을 빼준다.
	cntN-=1;
}
  • 위 부분이 제일 핵심이 되는 부분이다.

  • move = (move+1) % 4 : while문 종료 조건이 만족할 때까지 사각형 모양으로 돌아야 하기에 지정해준 dy, dx 배열에 맞게 move에는 0, 1, 2, 3 외에 다른 숫자가 와서는 안된다.

  • 이어서 if문은 가로 움직임대로  오른쪽, 왼쪽 방향 시에 cntN을 -1해 주어야 한다. 규칙을 보았을 때 move를 2로 나눈 나머지가 1일 때 즉, move가 홀수일 때 cntN에 -1을 해야 한다.
728x90
반응형
Comments