제로부터 C# 코딩테스트
프로그래머스 - 정수를 나선형으로 배치하기
휘게31
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