차곡차곡 성 쌓기
article thumbnail
Published 2023. 11. 12. 22:02
[D2] 달팽이 게임 알고리즘/백준

1. 문제

 

SW Expert Academy

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

swexpertacademy.com

 

 

 

 

2. 어뗗게 풀까

보기에는 쉬워보여서 무작정 4방향에 대해 for문을 쓰면 되지 않을까? 하고 구현을 했지만,, 점점 예상치 못한 곳이 늘어나고, 코드가 바뀌고, 결국 방향성을 잃어서 포기했다가 다시 도전했다.

 

어려웠던 점은 방향을 언제 바꿔줄지랑 방향을 바꿔주기 위해 체크하는 과정에서 실제 x,y 값을 바꿔주면 안되기에 비교를 어떻게 할까 애먹었다. 또한 2차원 배열을 사용했는데 `array[x][y]` 처럼 x값을 행으로 바라본 바람에 머릿속의 구조랑 전혀 달라져 x,y 위치를 바꿔 다시 구현했다.

 

문제의 핵심은 방향을 언제 바꿔줄지를 잘 선택하는 것이다. 고민 끝에 나는 이미 채워진 곳(0이 아닌 곳)이거나 배열의 범위 밖이면 방향을 전환하기로 하였다. 

 

 

 

3. 코드

import java.util.Scanner;

class Solution
{
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();

        int [] dx = {1,0,-1,0};
        int [] dy = {0,1,0,-1};
        for(int test_case = 1; test_case <= T; test_case++)
        {
            int N = sc.nextInt();
            int [][] array = new int[N+2][N+2];

            int d = 0;
            int num = 1;
            int x=1; int y=1;

            while(num <= N*N){
                // 한 방향에 대해서 전진
                while(true){
                    array[y][x] = num++;
                    // 좌표 이동
                    x = x + dx[d];
                    y = y + dy[d];
                    //  이미 채워진 곳이거나 배열의 범위 밖이면 방향 전환
                    if(array[y+dy[d]][x+dx[d]]!=0 || !validRange(x+dx[d], y+dy[d], N)){
                        d = (d+1)%4;
                        break;
                    }
                }
            }

            // 출력
            System.out.println("#" + test_case);
            for(int i=1; i<=N; i++){
                for(int j=1; j<=N; j++){
                    System.out.print(array[i][j]+" ");
                }
                System.out.println();
            }
        }
    }
    public static boolean validRange(int x, int y, int N){
        if(x>= 1 && x<=N && y>=1 && y <=N)
            return true;
        return false;
    }
}
728x90
profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 "좋아요" 해주세요!