본문 바로가기

제로부터 C# 코딩테스트

프로그래머스 - 정수를 나선형으로 배치하기

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