728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제)

 

 

 

풀이)

이 문제는 방향을 바꾸는데 신경을 조금 쓰면 해결되는 문제다.

먼저, 시계방향으로 계속 회전하며 전진하므로 오른쪽, 아래, 왼쪽, 위를 반복하면서 간다.

 

따라서, 해당 방향을 유지하다 index가 map 범위 밖으로 나가거나, map에 숫자가 채워져 있으면 방향을 바꾸면 된다.

또한 숫자는 입력받은 n의 제곱만큼의 숫자가 채워지므로, whlie문 탈출 조건을 이것으로 정했다.

 

import java.util.Scanner;

public class Solution_D2_1954_달팽이숫자 {

	public static void main(String[] args) {
		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[][] map = new int[n][n];
			int num = 1;
			// right, down, left, up
			int[] dx= {0,1,0,-1};
			int[] dy= {1,0,-1,0};
			int idx=0;
			int x=0;
			int y=0;
			
			while (num<=n*n) {	// 숫자를 다 채울 때까지
                //map 범위 내인가? 맞으면 채우고, 다음 곳으로
				if(0<=x && x<n && 0<=y && y<n && map[x][y]==0) { 				
                	map[x][y] = num;
					x += dx[idx%4];
					y += dy[idx%4];
					num++;
				}
				else {
					//범위 내가 아닐 때, 한 칸 더 계산되었으므로 원상태 복구 
					x -= dx[idx%4];
					y -= dy[idx%4];
                    //방향 틀기
					idx+=1;
					x += dx[idx%4];
					y += dy[idx%4];
				}
					
			}//while
			
			
			System.out.println("#"+test_case);
			for(int i=0; i<n; i++) {
				for(int j=0; j<n; j++) {
					System.out.print(map[i][j]+" ");
				}
				System.out.println();
				
			}	
		}//test_case
		sc.close();
	}//main
}

 

 

728x90

'코테 > SWEA' 카테고리의 다른 글

SWEA 2805. 농작물 수확하기(JAVA)  (0) 2022.08.12
SWEA 1873. 상호의 배틀필드(JAVA)  (0) 2022.08.10
SWEA 1210. Ladder1(JAVA)  (0) 2022.08.07
SWEA 1208. Flatten(JAVA)  (0) 2022.08.07
SWEA 1289. 원재의 메모리 복구하기(JAVA)  (0) 2022.08.07

+ Recent posts