개발바닥

BOJ_16935 [ 배열 돌리기 3 ] 본문

[ Algorithm ]/ [ BOJ ]

BOJ_16935 [ 배열 돌리기 3 ]

라이언 2020. 5. 7. 14:28
반응형

문제

https://www.acmicpc.net/problem/16935

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 → 7 4 6 2 3 1 7 4 6 2 3 1 → 1 8 3 4 2 9 9 2 3 6 1 5 → 7 2 6 9 8 2 4 2 9 3 1 8 → 1 6 2 9 8 4   <배열> <연산 결과> 2번 연

www.acmicpc.net

문제 해결 방법

주어진 조건대로 구현하면 된다.

 

오른쪽 90도 회전 tmp[i][j] = board[h-1-j][i]

왼쪽 90도 회전 tmp[i][j] = board[j][w-1-i]

 

 

 

소스 코드 보기

#include<iostream>
#include<vector>
#include<algorithm>
#include<stdlib.h>
#include<string.h>

using namespace std;
#define MAX 102
int N, M, R;
int board[MAX][MAX];
int tmp_board[MAX][MAX];
int n_len, m_len;
void print() {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cout << board[i][j] << ' ';
		}cout << '\n';
	}
}
void oneCmd() {
	int half = (N / 2);
	for (int i = 0; i < (N / 2); i++) {
		for (int j = 0; j < M; j++) {
			int tmp = board[i][j];
			board[i][j] = board[(N-1) - i][j];
			board[(N - 1) - i][j] = tmp;
		}
	}
}
void twoCmd() {
	int half = (M / 2);
	for (int j = 0; j < half; j++) {
		for (int i = 0; i < N; i++) {
			int tmp = board[i][j];
			board[i][j] = board[i][(M - 1) - j];
			board[i][(M - 1) - j] = tmp;
		}
	}
}
void threeCmd() {
	memset(tmp_board, 0, sizeof(tmp_board));
	int h = N;
	swap(N, M);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			tmp_board[i][j] = board[h-1-j][i];
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			board[i][j] = tmp_board[i][j];
		}
	}
}
void fourCmd() {
	
	memset(tmp_board, 0, sizeof(tmp_board));
	int w = M;
	swap(N, M);
	for (int i = 0; i < N; i++) {
		for (int j= 0; j < M; j++) {
			tmp_board[i][j] = board[j][w-1-i];
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			board[i][j] = tmp_board[i][j];
		}
	}
}
void fiveCmd() {
	memset(tmp_board, 0, sizeof(tmp_board));
	int half_n = (N / 2);
	int half_m = (M / 2);
	//1 -> 2
	for (int i = 0; i < half_n; i++) {
		for (int j = 0; j < half_m; j++) {
			tmp_board[i][j + half_m] = board[i][j];
		}
	}
	//2 ->3
	for (int i = 0; i < half_n; i++) {
		for (int j = half_m; j < M; j++) {
			tmp_board[i+half_n][j] = board[i][j];
		}
	}
	//3->4
	for (int i = half_n; i < N; i++) {
		for (int j = half_m; j < M; j++) {
			tmp_board[i][j - half_m] = board[i][j];
		}
	}
	//4->1
	for (int i = half_n; i < N; i++) {
		for (int j = 0; j < half_m; j++) {
			tmp_board[i-half_n][j] = board[i][j];
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			board[i][j] = tmp_board[i][j];
		}
	}
}
void sixCmd() {
	memset(tmp_board, 0, sizeof(tmp_board));
	int half_n = (N / 2);
	int half_m = (M / 2);
	//1 <- 2
	for (int i = 0; i < half_n; i++) {
		for (int j = half_m; j < M; j++) {
			tmp_board[i][j - half_m] = board[i][j];
		}
	}
	//2 <- 3
	for (int i = half_n; i < N ; i++) {
		for (int j = half_m; j < M; j++) {
			tmp_board[i - half_n][j] = board[i][j];
		}
	}
	//3 <- 4
	for (int i = half_n; i < N; i++) {
		for (int j = 0; j < half_m; j++) {
			tmp_board[i][j + half_m] = board[i][j];
		}
	}
	//4 <- 1
	for (int i = 0; i < half_n; i++) {
		for (int j = 0; j < half_m; j++) {
			tmp_board[i+half_n][j] = board[i][j];
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			board[i][j] = tmp_board[i][j];
		}
	}
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M >> R;
	
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> board[i][j];
		}
	}
	for (int i = 0; i < R; i++) {
		int num;
		cin >> num;
		if (num == 1) {
			oneCmd();
		}
		else if (num == 2) {
			twoCmd();
		}
		else if (num == 3) {
			threeCmd();
		}
		else if (num == 4) {
			fourCmd();
		}
		else if (num == 5) {
			fiveCmd();
		}
		else {
			sixCmd();
		}
	}

	print();

	return 0;
}

 

 

https://github.com/jokerKwu/BOJ_Algorithm/blob/master/Simulation/boj_16935.cpp

 

jokerKwu/BOJ_Algorithm

Contribute to jokerKwu/BOJ_Algorithm development by creating an account on GitHub.

github.com

 

 

반응형

'[ Algorithm ] > [ BOJ ]' 카테고리의 다른 글

BOJ_10942 [ 팰린드롬? ]  (1) 2020.06.09
BOJ_14442 [ 벽 부수고 이동하기 2 ]  (0) 2020.06.07
BOJ_17069 [ 파이프 옮기기2 ]  (0) 2020.05.07
BOJ_17828 [ 문자열 화폐 ]  (0) 2020.04.08
BOJ_18809 [ 수 찾기 ]  (0) 2020.04.08
Comments