[SWEA] 1954 달팽이 숫자 (C++)

우리누리·2023년 11월 13일
0

👓 문제 설명

달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
ex) n = 3
1 2 3
8 9 4
7 6 5


💣 제한 사항

  • 달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)

🚨 접근 방법

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;
}

0개의 댓글