ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 정수를 나선형으로 배치하기
    제로부터 C# 코딩테스트 2023. 11. 22. 21:10
    728x90

     

    주어진 n으로 n*n의 배열을 나선형으로 배치한 이차원 배열을 만드는 문제.

     

    1. 방문처리할 배열을 만듭니다.

    2. 이동경로 (4가지방향)을 가지고있는 이차원 배열을 만듭니다.(경로는 오른쪽,아래,왼쪽,위 순으로 이동할 것)

    3. 나선형으로 n*n 숫자까지 반복 할 것이기 때문에 listIdx를 만들어줍니다.(경로를 바꿀때마다 ++, 경로의 인덱스를 넘길시 %4)

    4. n*n 숫자까지 모두 채울 때 가지 반복할 것이기 때문에 while문을 만들어 줍니다.

    5. 조건으로 다음으로 이동할 배열이 이차원 배열을 넘어가지 않으면서 방문하지 않았으면 다음으로 이동할 배열에 현재배열 ++ 해주고 방문 처리를 해준뒤 다음으로 이동할 배열위치를 List에 담아줍니다. 조건에 해당 되지않았을 경우는 경로를 바꿔주야 함으로 경로인덱스를++ 해주고 기존배열 좌표를 list에 담아줍니다.

    6. 경로인덱스는 경로가 바뀔때마다 ++ 해줌으로 기존의인덱스를 초과를 해버릴 것이기 떄문에 %4를 해줍니다.

    using System;
    using System.Collections.Generic;
    
    public class Solution {
        public int[,] solution(int n) {
            int[,] answer = new int[n,n];
            bool[,] visited = new bool[n,n];
            
            int[,] move = new int[,]{{0,1},{1,0},{0,-1},{-1,0}};
            int listIdx = 0;
            
            List<int[]> list = new List<int[]>();
            list.Add(new int[]{0,0});
            visited[0,0] = true;
            answer[0,0] = 1;
            
            int count = 1;
            
            while(count < n*n){
                int[] current = list[0];
                list.RemoveAt(0);
                int x = current[0];
                int y = current[1];
                int nx = x + move[listIdx,0];
                int ny = y + move[listIdx,1];
                    if(nx>=0 && ny >= 0 && nx < n && ny < n && !visited[nx,ny]){
                        list.Add(new int[]{nx,ny});
                        answer[nx,ny] = answer[x,y]+1;
                        visited[nx,ny] = true;
                        count++;
                    }else{
                        listIdx++;
                        list.Add(new int[]{x,y});
                    }
                listIdx %=4;
            }
            return answer;
        }
    }
    728x90
Designed by Tistory.