문제 설명
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한 사항
- 1 ≤ n ≤ 30
풀이
정답률이 낮은 문제 중 lv.0이라 신기해서 풀어봤다.
문제는 간단히 달팽이처럼 돌아가며 배열을 채우는 것이다.
우선, answer에 nxn의 크기를 0으로 채운다.
vector에 원소를 넣으면서 하면 가장 오른쪽의 원소를 채울때 곤란하기 때문이다.
패턴을 분석해보면 →, ↓, ←, ↑순으로 진행된다.
이때, 가장 바깥줄은 n-1번의 원소를 채우는 것이 3번 반복된다.
이외에는 n-i번을 채우는 작업을 2번씩 반복한다.
그렇다면 가장 바깥줄을 미리 한 줄 채우고 시작한다면 모두 2번씩 반복하는 패턴을 만들 수 있다.
즉, 가장윗줄은 1~n까지 들어가는 것은 언제나 같으므로 기본적으로 세팅한 뒤 문제를 풀면 된다.
전체 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> solution(int n) {
vector<vector<int>> answer(n, vector<int>(n, 0));
vector<int> dy = {0, 1, 0, -1};
vector<int> dx = {1, 0, -1, 0};
int dir = 1;
int limit = n-1;
int num = n+1;
int cnt = 0;
for(int i = 0; i < n; i++)
{
answer[0][i] = i+1;
}
int y = 0;
int x = n-1;
for(int t = 0; t < 2*n-2; t++)
{
for(int i = 0; i < limit; i++)
{
y += dy[dir];
x += dx[dir];
answer[y][x] = num++;
}
//change dir
dir = (dir+1) % 4;
cnt++;
if(cnt == 2)
{
cnt = 0;
limit--;
}
}
return answer;
}