[C++] 프로그래머스 정수를 나선형으로 배치하기

문제설명

양의 정수 n이 매개변수로 주어집니다.
n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터
시계방향 나선형으로 배치한 이차원 배열을
return 하는 solution 함수를 작성해 주세요.


제한사항

• 1 ≤ n ≤ 30


입출력 예

n result
4 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]


풀이

1부터 n을 제곱한 값까지 n x n 배열에 나선형으로 배치하는 구현 문제입니다.

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(int n) {
    vector<vector<int>> answer;
    
    // 0인 2차원 배열 만들기
    vector<int> temp;
    
    for(int i = 0; i < n; i++)
    {
        temp.clear();
        answer.push_back(temp);
        for(int j = 0; j < n; j++)
        {
            answer[i].push_back(0);
        }
    }
    
    
    // 0을 찾아 채우는 알고리즘
    int a = 1;
    int i = 0;
    int j = 0;
    
    while(a <= n*n)
    {
        // 오른쪽으로 이동하여 탐색
        while(i < n && j < n && answer[i][j] == 0)
        {
            
            answer[i][j] = a;
            a++;
            
            if ((j + 1) == n)
            {
                i++;
                break;
            }
            else if(answer[i][j + 1] != 0)
            {
                i++;
                break;
            }
            else
            {
                j++;
            }
        }
        
        // 아래로 이동하여 탐색
        while(i < n && j < n && answer[i][j] == 0)
        {
            answer[i][j] = a;
            a++;
            
            if ((i + 1) == n)
            {
                j--;
                break;
            }
            else if(answer[i + 1][j] != 0)
            {
                j--;
                break;
            }
            else
            {
                i++;
            }
        }
        
        // 왼쪽으로 이동하여 탐색
        while(i < n && j < n && j >= 0 && answer[i][j] == 0)
        {
            answer[i][j] = a;
            a++;
            
            if ((j - 1) == -1)
            {
                i--;
                break;
            }
            else if(answer[j][j - 1] != 0)
            {
                i--;
                break;
            }
            else
            {
                j--;
            }
        }
        
        // 위쪽으로 이동하여 탐색
        while(i < n && j < n && i >= 0 && answer[i][j] == 0)
        {
            answer[i][j] = a;
            a++;
            
            if ((i - 1) == -1)
            {
                j++;
                break;
            }
            else if(answer[i - 1][j] != 0)
            {
                j++;
                break;
            }
            else
            {
                i--;
            }
        }
    }
    
    return answer;
}


결과

코드 실행결과

Categories:

Updated:

Leave a comment