[백준] 16935 배열 돌리기 3

Dragony·2020년 2월 12일
0

코딩테스트

목록 보기
10/29

백준16935


#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int N, M, R;
int b[100][100];

void udturn(int **a) {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			b[(N - 1) - i][j] = a[i][j];
		}
	}	

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			a[i][j] = b[i][j];
		}
	}

}

void rlturn(int **a) {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			b[i][(M-1)-j] = a[i][j];
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			a[i][j] = b[i][j];
		}
	}
}

void right_turn(int **a) {

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			b[j][(N - 1) - i] = a[i][j];
		}
	}
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			a[i][j] = b[i][j];
		}
	}

	swap(N, M);
}

void left_turn(int **a) {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			b[(M-1)-j][i] = a[i][j];
		}
	}
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			a[i][j] = b[i][j];
		}
	}
	swap(N, M);
}

void five(int **a) {
	int n = N / 2;
	int m = M / 2;

	//1번을 2번으로
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			b[i][j+m] = a[i][j];
		}
	}

	//2번을 3번으로
	for (int i = 0; i < n; i++) {
		for (int j = m; j < M; j++) {
			b[n+i][j] = a[i][j];
		}
	}

	//3번을 4번으로
	for (int i = n; i < N; i++) {
		for (int j = m; j < M; j++) {
			b[i][j-m] = a[i][j];
		}
	}
	//4번을 1번으로
	for (int i = n; i < N; i++) {
		for (int j = 0; j < m; j++) {
			b[i-n][j] = a[i][j];
		}
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			a[i][j] = b[i][j];
		}
	}


}
void six(int **a) {
	int n = N / 2;
	int m = M / 2;

	//1번을 4번으로
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			b[n + i][j] = a[i][j];
		}
	}
	//4번을 3번으로
	for (int i = n; i < N; i++) {
		for (int j = 0; j < m; j++) {
			b[i][m + j] = a[i][j];
		}
	}

	//3번으 2번으로
	for (int i = n; i < N; i++) {
		for (int j = m; j < M; j++) {
			b[i-n][j] = a[i][j];
		}
	}
	//2번을 1번으로
	for (int i = 0; i < n; i++) {
		for (int j = m; j < M; j++) {
			b[i][j-m] = a[i][j];
		}
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			a[i][j] = b[i][j];
		}
	}

}
 
int main() {

	cin >> N >> M >> R;

	int **arr = new int*[100];
	for (int i = 0; i < 100; i++) {
		arr[i] = new int[100];
		memset(arr[i], 0, sizeof(int)*100);
	}

	int r[1000];

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++) {
			scanf("%d", &arr[i][j]);
		}
	} 

	for (int i = 0; i < R; i++) {
		scanf("%d", &r[i]);
	}

	for (int i = 0; i < R; i++) {
		if (r[i] == 1) {
			udturn(arr);
		}
		else if (r[i] == 2) {
			rlturn(arr);
		}
		else if (r[i] == 3) {
			right_turn(arr);
		}
		else if (r[i] == 4) {
			left_turn(arr);
		}
		else if (r[i] == 5) {
			five(arr);
		}
		else {
			six(arr);
		}
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;

예시 보면서 직관으로 푸는게 더 쉬운 것 같다.
3,4번 연산은 N,M이 바뀌므로 주의할 것.

profile
안녕하세요 :) 제 개인 공부 정리 블로그입니다. 틀린 내용 수정, 피드백 환영합니다.

0개의 댓글