달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
ex) n = 3
1 2 3
8 9 4
7 6 5
D2 문제 치고 굉장히 시간이 오래걸렸다.
직접 그림을 그려보니 동 남 서 북으로 하나의 선분을 그려가며 숫자가 채워졌다.
x, y 좌표를 동 남 서 북에 대해 변하는 값을 구해보니
동 : (0, +1)
남 : (+1, 0)
서 : (0, -1)
북 : (-1, 0) 이런 식으로 하나의 방향에 대해서 음,양의 값으로 1씩 변한다.
또한 동, 서 방향으로 하나의 선분을 그리고 난 후 채워야할 숫자의 개수가 1씩 감소한다.
이 두 단서를 이용하여 해결했다.
#include<iostream>
using namespace std;
int main(int argc, char** argv)
{
int test_case;
int T,n;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
cin >> n;
int size = n;
int arr[10][10] = { 0, };
int low = 0, col = -1, dir = 1, val = 1;
while (size > 0) {
// 동 남 서 북으로 진행, (동,남) -> +, (서,북) -> -, 동,서 지나면 사이즈-1
for (int i = 0; i < size; i++) {
col += dir;
arr[low][col] = val++;
}
size--;
for (int i = 0; i < size; i++) {
low += dir;
arr[low][col] = val++;
}
dir *= -1;
}
cout << "#" << test_case << "\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j == n - 1) {
cout << arr[i][j] << "\n";
}
else {
cout << arr[i][j] << " ";
}
}
}
}
return 0;
}