SW Expert Academy - 1954. 달팽이 숫자

1 minute read

문제링크

문제설명

  • 자연수 N 이 주어졌을 때 달팽이 숫자는 1부터 NxN 까지의 숫자가 시계방향으로 이루어진다.
    • (0,0) 부터 시계방향으로 회전하며 1부터 채워진다.
  • 주어진 N의 달팽이 숫자를 출력하라

문제접근

  • 재귀로 해결한다.
  • N x N 크기의 지도에서 (0,0) 을 시작으로 시계 방향으로 1부터 값이 채워진다. N x N 크기의 지도의 테두리에 값이 모두 채워지면 (1,1) 을 시작으로 (N-2) x (N-2) 크기의 지도의 테두리에 값을 채우도록 로직을 반복한다.
  • 이러한 로직은 시작점이 (0,0) -> (1,1) -> (2,2) … 로 변해가며 지도의 크기는 줄어들고 테두리에 값을 채우는 과정은 모두 동일하므로 재귀적으로 문제를 쪼개가며 풀어낼 수 있다.

구현

#include <iostream>
#include <memory.h>
#define MAX_N 10
using namespace std;

int board[MAX_N][MAX_N];

void setSnailNumber(int startX, int startY, int n, int val) {
	if (n == 1) {
		board[startX][startY] = val;
		return;
	}
	if (n <= 0) {
		return;
	}

	// 맨 위 가로
	int increment = 0;
	for (int c = startY; c < startY + n; c++) {
		board[startX][c] = val + increment++;
	}

	// 맨 우측 세로
	for (int r = startX + 1; r < startX + n; r++) {
		board[r][startY + n - 1] = val + increment++;
	}

	// 맨 아래 가로
	for (int c = startY + n - 2; c >= startY; c--) {
		board[startX + n - 1][c] = val + increment++;
	}

	// 맨 좌측 세로
	for (int r = startX + n - 2; r > startX; r--) {
		board[r][startY] = val + increment++;
	}

	setSnailNumber(startX + 1, startY + 1, n - 2, val + increment);
}

int main(int argc, char** argv)
{
	int test_case;
	int T;
	// freopen("input.txt", "r", stdin);
	cin >> T;
	for (test_case = 1; test_case <= T; ++test_case)
	{
		int n;
		cin >> n;
		memset(board, 0, sizeof(board));
		setSnailNumber(0, 0, n, 1);
		cout << "#" << test_case << "\n";
		for (int r = 0; r < n; r++) {
			for (int c = 0; c < n; c++) {
				cout << board[r][c] << " ";
			}
			cout << "\n";
		}
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

Leave a comment