본문 바로가기
알고리즘/SW Expert Academy 문제풀이

[SW Expert Academy Java] 1954 달팽이 숫자

by 새싹감자 2022. 9. 12.

문제


SW Expert Academy

 

 

 

SW Expert Academy

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

swexpertacademy.com

풀이방법


D2치고는 좀 까다로운 문제였다.

찾아야할 조건은 다음과 같다.

 

1.방향전환의 조건

-경계를 넘어갈 때 방향 전환

-이미 숫자가 채워져있으면, 방향 전환


2.방향 변환의 규칙

-델타{오른쪽->아래->왼쪽->위}


3.종료 조건

-0인 값이 없으면 종료

-값이 N*N이 되면 종료

 

 

1)N*N 이차원 배열 준비

2)(0,0)에서 시작

3)현 위치에 값 셋팅

4) 다음 위치로 진행

    -방향 전환 조건에 해당하면 -> 진행 방향 변경

    -방향 전환 조건에 해당안됨 -> 진행 방향으로 진행

5)값 증가

6)출력 후 종료

 

코드


import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int test = input.nextInt();
        for(int t=0; t<test; t++) {
             int num = input.nextInt();
                int index[][] = {{0,1},{1,0},{0,-1},{-1,0}};
                int snail[][] = new int[num][num];

                int x=index[0][0];
                int y=index[0][1];
                int nx=0;
                int ny=0;
                int n=1;
                int change=0;

                while(snail[nx][ny]==0) {
                    snail[nx][ny]=n;
                    n++;
                    nx=nx+x;
                    ny=ny+y;
                    if(nx>=num || nx<0 || ny>=num || ny<0 || snail[nx][ny]!=0) {
                        change=(change+1)%4;
                        nx=nx-x;
                        ny=ny-y;
                        x = index[change][0];
                        y = index[change][1];
                        nx=nx+x;
                        ny=ny+y;
                    }
                }

                System.out.printf("#%d",t+1);
                System.out.println();
                for(int i=0; i<num; i++) {
                    for(int j=0; j<num; j++) {
                        System.out.print(snail[i][j]+ " ");
                    }
                    System.out.println();
                }
        }


    }
}

댓글