본문 바로가기

공부의 기록/SWEA

[SWEA] 1954. 달팽이 숫자 - java

728x90

1954. 달팽이 숫자

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

 

SW Expert Academy

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

swexpertacademy.com

 풀이 방법

  • 배열이 채워지는 순서가 우->하->좌->상으로 반복
  • 배열의 끝을 만나거나 이미 채워진 부분을 만났을 때 방향이 바뀐다.
  • 채워지는 수인 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