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

swb·2022년 11월 18일
0

SWEA

목록 보기
15/19

문제 바로가기

접근 방법

  1. DFS로 푸는 방법이 있다고 하는데 아직 재귀가 익숙치 않아 for문으로 풀었다.
  2. 결국 이 문제도 없을 것 같지만 규칙이 있었다.
    1) 상
    2) 우
    3) 하
    4) 좌

이렇게 차례대로 배열에 넣어주면 된다. i나j는 고정되어 있기 때문에 for문 한 개씩 4번 돌려주면 된다.

  • 상 : i는 0으로 고정 j는 증가
  • 우 : i는 증가 j는 0으로 고정
  • 하 : i는 3으로 고정 j는 감소
  • 좌 : i는 감소 j는 0으로 고정
    위의 규칙을 찾아보면 된다. 하나씩 보다보면 결국 보인다.
  1. 상하좌우를 반복하는 횟수는 N/2 + 1이다.

풀이

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstdio>
using namespace std;

int tc, T, N, num;
int arr[100][100] = { 0, };

int main() {
	cin >> T;

	for (tc = 1; tc <= T; tc++) {
		cin >> N;

		num = 1;
		// 규칙 : N/2 + 1번 반복해서 진행된다.
		for (int r = 0; r < N / 2 + 1; r++) {
			// 위
			for (int i = r; i < N - r; i++) {
				arr[r][i] = num++;
			}
		
			// 우
			for (int i = r + 1; i < N - r; i++) {
				arr[i][N - r - 1] = num++;
			}

			// 아래
			for (int i = N - r - 2; i >= r; i--) {
				arr[N - r - 1][i] = num++;
			}

			// 좌
			for (int i = N - r - 2; i > r; i--) {
				arr[i][r] = num++;
			}
		}

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


	}
	return 0;
}
profile
개발 시작

0개의 댓글