본문 바로가기
algorithm/SW Expert Academy

[2차원 배열 연습 문제] 달팽이 숫자 - 1954

by 에어컨조아 2020. 1. 8.

문제 : https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

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

swexpertacademy.com

 

코드 : 

#include <iostream>

using namespace std;

int main()
{
	int T;
	cin >> T;

	int c = 0;
	while (c < T)
	{
		int N;
		cin >> N;

		int num[10][10] = { 0 };
		int move[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} };
		int total = N * N;

		int i = 0;
		int j = 0;
		int m = 0;
		for (int k = 1; k <= total; k++)
		{
			num[i][j] = k;

			i += move[m][0];
			j += move[m][1];
			//범위 밖
			if ((i < 0 || i >= N) || (j < 0 || j >= N) || (num[i][j] != 0))
			{ 
				i -= move[m][0];
				j -= move[m][1];
				m++;
				if (m % 4 == 0)
				{
					m = 0;
				}
				i += move[m][0];
				j += move[m][1];
			}
		}

		c++;
		cout << "#" << c << "\n";
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cout << num[i][j] << " ";
			}
			cout << "\n";
		}
	}
	


	return 0;
}

 

문제접근은 방문->이동->조건 식으로 생각하여 구현하였다.

다른 사람들 풀이를 보니 대부분 나와 비슷하게 풀었다.

나는 X+1, Y+1, X -1, Y -1 순으로 하나씩 생각했다면 

대부분

  1. 처음엔 x, y 둘다 +1씩 그다음 x,y -1씩 이동하는 규칙
  2. 세로로 이동할땐 항상 갯수를 하나씩 빼줘야 한다. 

댓글