#include <iostream>
#include <iomanip>
using namespace std;
const int MAX = 100;
int board[MAX][MAX] = {};
int N;
enum DIR { RIGHT = 0, DOWN = 1, LEFT = 2, UP = 3 };
void PrintBoard() {
for (int y = 0; y < N; y++) {
for (int x = 0; x < N; x++) {
cout << setfill('0') << setw(2) << board[y][x] << " ";
}
cout << endl;
}
}
bool CanGo(int nx, int ny) {
if (nx < 0 || nx >= N || ny < 0 || ny >= N || board[nx][ny] != 0)
return false;
return true;
}
void SetBoard() {
int dir = RIGHT;
int num = 1;
int x = 0, y = 0;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
while (true) {
board[y][x] = num;
if (num == N * N) break;
int next_x = x + dx[dir];
int next_y = y + dy[dir];
if (CanGo(next_x, next_y)) {
x = next_x;
y = next_y;
num++;
} else {
dir = (dir + 1) % 4;
}
}
}
int main() {
cin >> N;
SetBoard();
PrintBoard();
return 0;
}
📍 입력 예시
5
📍 출력 예시
01 02 03 04 05
16 17 18 19 06
15 24 25 20 07
14 23 22 21 08
13 12 11 10 09
board[N][N]을 선언하여 숫자를 채워 넣음N을 입력받아 보드 크기를 결정dx[] = {1, 0, -1, 0}; // X축 이동 (오른쪽, 아래, 왼쪽, 위)
dy[] = {0, 1, 0, -1}; // Y축 이동 (오른쪽, 아래, 왼쪽, 위)(nextX, nextY)가board[nextX][nextY] == 0 이면 이동 가능(dir + 1) % 4를 사용하여 순환 처리#include <iostream>
#include <iomanip> // 숫자 두 자리로 포맷
using namespace std;
const int MAX = 100; // 보드의 최대 크기 (100x100)
int board[MAX][MAX] = {}; // 2차원 배열 (초기값 0)
int N; // 보드 크기
📍 설명
MAX = 100: 보드 최대 크기 설정 (메모리 효율 고려)board[MAX][MAX]: 100x100 배열을 선언, 초기값은 0N: 사용자 입력을 받아 보드 크기를 결정enum DIR {
RIGHT = 0, // → 오른쪽
DOWN = 1, // ↓ 아래
LEFT = 2, // ← 왼쪽
UP = 3 // ↑ 위
};
📍 설명
enum을 사용하여 방향을 숫자로 표현void PrintBoard() {
for (int y = 0; y < N; y++) {
for (int x = 0; x < N; x++) {
cout << setfill('0') << setw(2) << board[y][x] << " ";
}
cout << endl;
}
}
📍 설명
setfill('0') << setw(2): 숫자를 두 자리(01, 02)로 출력endl을 사용하여 줄바꿈 처리bool CanGo(int nx, int ny) {
if (nx < 0 || nx >= N) return false; // X 범위 초과
if (ny < 0 || ny >= N) return false; // Y 범위 초과
if (board[nx][ny] != 0) return false; // 이미 숫자가 채워짐
return true;
}
📍 설명
(nx, ny) 좌표가 보드 범위를 벗어나면 falseboard[nx][ny] != 0 → 이미 숫자가 있는 경우 falsetrue 반환void SetBoard() {
int dir = RIGHT; // 초기 방향: 오른쪽
int num = 1; // 채울 숫자
int x = 0, y = 0; // 시작 위치 (0, 0)
int dx[4] = {1, 0, -1, 0}; // X축 이동 (→ ↓ ← ↑)
int dy[4] = {0, 1, 0, -1}; // Y축 이동 (→ ↓ ← ↑)
while (true) {
board[y][x] = num; // 현재 위치에 숫자 채우기
if (num == N * N) break; // 마지막 숫자 도달 시 종료
int next_x = x + dx[dir]; // 다음 X 좌표
int next_y = y + dy[dir]; // 다음 Y 좌표
if (CanGo(next_x, next_y)) {
x = next_x;
y = next_y;
num++;
}
else {
dir = (dir + 1) % 4; // 이동 불가능하면 방향 전환
}
}
}
📍 설명
num = 1부터 시작하여 순차적으로 보드에 채워 넣음(next_x, next_y)를 계산하여 이동 가능 여부 확인(dir + 1) % 4를 사용하여 다음 방향으로 전환main() 함수int main() {
cin >> N; // 보드 크기 입력받기
SetBoard(); // 보드 숫자 채우기
PrintBoard(); // 결과 출력
return 0;
}
📍 설명
cin >> N;을 통해 보드 크기를 입력받음SetBoard()를 호출하여 달팽이 모양으로 숫자를 채움PrintBoard()를 호출하여 완성된 보드를 출력