본문 바로가기
알고리즘/SWEA

[SWEA] 1954. 달팽이 숫자

by hyerann 2019. 4. 21.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

나름의 규칙을 찾아내서 그걸 코드로 표현했다.

빙글빙글 도는 순서가 오른쪽, 아래, 왼쪽, 위로 반복되기 때문에 dir 변수에 0~3 값을 넣어주면서 방향을 구분했다.

그리고 바깥에서 안으로 숫자를 채워가므로 startY, endY, startX, endX 변수를 이용해서 경계가 될 index를 관리하면서 경계를 만나면 방향을 바꿔주었다.

#include <iostream>
#include <ios>
using namespace std;

int T, N, snail[10][10];
void makeSnail();
void print();

int main() {
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> T;
	for (int testCase = 1; testCase <= T; testCase++) {
		cin >> N;
		cout << '#' << testCase << ' ' << "\n";
		makeSnail();
	}
	return 0;
}

void makeSnail() {
	int idx = N*N;
	int y = 0, x = 0, num = 1;
	int startY = 0, endY = N - 1, startX = 0, endX = N - 1;
	int dir = 0;	// 0: 오른쪽, 1: 아래, 2: 왼쪽, 3: 위
	while (idx) {
		snail[y][x] = num;
		switch (dir) {
		case 0:
			if (x != endX) x = x + 1;
			else { startY++; dir++; y++; }
			break;
		case 1:
			if (y != endY) y = y + 1;
			else { endX--; dir++; x--; }
			break;
		case 2:
			if (x != startX) x = x - 1;
			else { endY--; dir++; y--; }
			break;
		case 3:
			if (y != startY)y = y - 1;
			else { startX++; dir = 0; x++; }
			break;
		}
		num++;
		idx--;
	}
	print();
}

void print() {
	for (int y = 0; y < N; y++) {
		for (int x = 0; x < N; x++) {
			cout << snail[y][x] << ' ';
		}
		cout << "\n";
	}
}

댓글