SWEA/[D2]

[C언어] SWEA 1961 숫자 배열 회전

ruming 2020. 8. 16. 05:02
//SWEA1961 숫자 배열 회전
#include <stdio.h>
int main(void){
	int testCase, i, j, k;
	int n;
	int N[7][7] = {0};
	scanf("%d", &testCase);
	for(i=0; i<testCase; i++){
		scanf("%d", &n);
		for(j=0; j<n; j++){
			for(k=0; k<n; k++){
				scanf("%d", &N[j][k]);
			}
		}
		printf("#%d\n", i+1);
		for(j=0; j<n; j++){
			for(k=0; k<n; k++){
				printf("%d", N[n-1-k][j]);
			}
			printf(" ");
			for(k=0; k<n; k++){
				printf("%d", N[n-1-j][n-1-k]);
			}
			printf(" ");
			for(k=0; k<n; k++){
				printf("%d", N[k][n-1-j]);
			}
			printf("\n");
		}
	}
	return 0;
}

 

입력 받은 배열 순서(구조)

00 01 02

10 11 12

20 21 22

90도 / 180도 /270도 돌리면

20 10 00 / 22 21 20 / 02 12 22

21 11 01 / 12 11 10 / 01 11 21

22 12 02 / 02 01 00 / 00 10 20

돌린 배열을 한번에 출력하는 게 아니라 세 개를 한줄씩 출력하니까 더 헷갈렸다.

출력할 때 j나 k를 뺄 생각을 왜 못했는지 모르겠다. 저거때문에 변수 만들고 난리쳤었는데...

 

1)배열 세개 만들어서 돌린 배열들을 저장하고 한줄씩 출력하는 방법과 2)함수를 만들어서 배열을 계속 돌리는 방법을 생각했었는데 둘 다 실패했다. 첫번째 거는 그냥 반복문을 잘못 쓴 거 같은데 다시 짜기가 귀찮다 코드가 길기 때문.,, 함수는 배열을 두번 세번 돌릴때 어떻게 해야 될 지 모르겠다. 한번 돌리고 다른 데에 저장하고 또 함수에 넣어야 하는지? 그리고 이차원 배열을 포인터로 함수에 전달하는 방법을 찾아보긴 했는데 컴파일 오류가 많이 나서 되는지 잘 모르겠다.

 


옛날엔 이거 어려웠는데 지금보니까 그냥 순서만 잘 생각하면 되는거였네

문제를 문제 그대로 보지말고 구현할 때 어떻게 해야하는지 생각하는 게 중요한 거 같다.

전에는 회전에 집착해서 90도, 180도, 270도 돌린 걸 따로 생각해서 어려웠지만

그냥 출력이 어떻게 되는지 잘 생각해보면 생각보다 쉽게 풀리는 문제였다.

 

#include <stdio.h>
int main(void) {
	int T;
	scanf("%d", &T);
	for (int test_case = 1; test_case <= T; test_case++) {
		int N;
		int n[7][7] = { 0 };
		scanf("%d", &N);
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				scanf("%d", &n[i][j]);
			}
		}
		printf("#%d\n", test_case);
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				printf("%d", n[N - 1 - j][i]);
			}
			printf(" ");
			for (int j = 0; j < N; j++) {
				printf("%d", n[N - 1 - i][N - 1 - j]);
			}
			printf(" ");
			for (int j = 0; j < N; j++) {
				printf("%d", n[j][N - 1 - i]);
			}
			printf("\n");
		}
	}
	return 0;
}