본문 바로가기
JAVA/Coding Test Study

[D2] SWEA - 1954. 달팽이 숫자 : Java

by ♡˖GYURI˖♡ 2024. 10. 25.
728x90
 

SW Expert Academy

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

swexpertacademy.com

 

 

 

문제

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.


[예제]

N이 3일 경우,
 


N이 4일 경우,
 

[제약사항]

달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)


[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.


[출력]

각 줄은 '#t'로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
입력
2    
3   
4  
출력
#1
1 2 3
8 9 4
7 6 5
#2
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7 

 

 

 

풀이

참고

 

[SWEA] 1954. 달팽이 숫자 _ JAVA

1954. 달팽이 숫자 (D2) _ JAVA

velog.io

import java.util.*;

class Solution
{
	public static void main(String args[]) throws Exception
	{
		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[][] arr = makeArr(n);
            
            System.out.println("#" + test_case);
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
		}
	}
    
    private static int[][] makeArr(int n) {
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};
        
        int[][] arr = new int[n][n];
        int dir = 0;
        int x = 0;
        int y = 0;
        
        for (int i = 1; i <= n * n; i++) {
            arr[x][y] = i;
            
            if (x + dx[dir] >= n || y + dy[dir] >= n
				|| x + dx[dir] < 0 || y + dy[dir] < 0
				|| arr[x + dx[dir]][y + dy[dir]] != 0 ) {
                dir = (dir + 1) % 4;
            }
            
            x += dx[dir];
            y += dy[dir];
        }
        
        return arr;
    }
}
  • dx와 dy로 방향 설정 (우,하,좌,상 순서)
  • dir : 방향 인덱스 (예를 들어 0이면 dx[0], dy[0]인 우측 방향을 뜻함)
  • x, y : 현재 인덱스로 사용
  • for문 순회 (1부터 n * n까지)
    • arr[x][y]에 i 값 저장
    • 조건 : 배열이 범위에서 벗어나거나, 이미 숫자가 존재한다면 dir를 다음으로 바꿔줌
      • 주의할 점 : 범위 먼저 판단하고 숫자 존재 여부를 판단해야 함
      • 순서가 바뀌면, 범위를 벗어난 곳이더라도 숫자 존재 여부를 판단하니 RuntimeException 발생
    • x와 y 업데이트
  • 시간복잡도 : O(N^2) (이 때 N은 입력받은 숫자의 크기)

 

프로그래머스인지, 백준인지 모르겠지만 분명 풀었던 문젠데 ㅎ... 기억이 하나도 나지 않는다.