반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [SW expert Academy] SWEA 1954번 달팽이 숫자 자바(Java)

1) 난이도 : D2

 

2) 문제번호 : 1954번

 

3) 문제 출처

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=%EB%8B%AC%ED%8C%BD%EC%9D%B4&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

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

swexpertacademy.com

2. 문제

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

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


[예제]

N이 3일 경우,


N이 4일 경우,
 

3. 제약사항

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

 

4. 입력

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

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

 

5. 출력

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

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

6. 풀이

- 테스트케이스를 보면, 오른쪽 이동, 아래 이동, 왼쪽 이동, 위로 이동이다.- 순서에 맞게 dx, dy 설정- 만약에 N이 1일 경우에는 1만 출력하면 되므로 1출력(for문을 안돌아도 된다.)- 3번째 이동까지는 N까지만 이동하면 되는데 오른쪽으로 이동할 때, y값이 N과 0을 벗어나면 안되고, x값이 N을 벗어나면 안되므로 if문 사용- 그 후에, 배열값이 0이 아닌 다른 값이 있을 경우에 방향 전환

7. 소스 코드

import java.util.Arrays;
import java.util.Scanner;
 
public class Solution {
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	int T = sc.nextInt();
    	//우,하,좌,상
    	int[] dx = {0,1,0,-1};
    	int[] dy = {1,0,-1,0};
    	
    	for(int tc=1;tc<=T;tc++) {
    		int N = sc.nextInt();
    		if(N==1) {
    			System.out.printf("#%d\n",tc);
    			System.out.println(1);
    			continue;
    		}
    		int x = 0;
    		int y = 0;
    		//방향
    		int dir = 0;
    		int[][] arr = new int[N][N];
    		
    		for(int i=0;i<N*N;i++) {
    			arr[x][y]=i+1;
    			x += dx[dir];
    			y += dy[dir];
    			
    			if(x < 0 || x >= N || y < 0 || y >= N) {
    				//원래 자리로 돌려놓고
    				x -= dx[dir];
    				y -= dy[dir];
    				
    				//방향전환
    				dir = (dir+1)%4;
    				
    				//다시 이동
    				x += dx[dir];
    				y += dy[dir];
    			}
    			
    			//배열값이 있을 경우에 다시 돌려놓고 방향전환 후 이동
    			if(arr[x][y]!=0) {
    				//원래 자리로 돌려놓고
    				x -= dx[dir];
    				y -= dy[dir];
    				
    				//방향전환
    				dir = (dir+1)%4;
    				
    				//다시 이동
    				x += dx[dir];
    				y += dy[dir];
    			}
    		}
    		System.out.printf("#%d\n",tc);
    		for(int i=0;i<N;i++) {
    			for(int j=0;j<N;j++) {
    				System.out.print(arr[i][j]+ " ");
    			}
    			System.out.println();
    		}
    	}
    }
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기