본문 바로가기

Algorithm/BAEKJOON

[BOJ] 16927번 배열 돌리기 2 (C++)

728x90
반응형

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

 

16927번: 배열 돌리기 2

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

 

#include <iostream>
#include <algorithm>
using namespace std;

int n, m, r;
int arr[301][301];

void rotate(int start, int len){
	int t = r % len;
	for(int i = 0; i < t; i++){
		int tmp = arr[start][start];
		for(int j = start + 1; j <= m - start + 1; j++)
			arr[start][j - 1] = arr[start][j];
		for(int j = start + 1; j <= n - start + 1; j++)
			arr[j - 1][m - start + 1] = arr[j][m - start + 1];
		for(int j = m - start + 1; j >= start + 1; j--)
			arr[n - start + 1][j] = arr[n - start + 1][j - 1];
		for(int j = n - start + 1; j >= start + 2; j--)
			arr[j][start] = arr[j - 1][start];
		arr[start + 1][start] = tmp;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin >> n >> m >> r;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin >> arr[i][j];
		}
	}
	
	int cnt = min(n, m) / 2;
	int N = n, M = m;
	
	for(int i = 1; i <= cnt; i++){
		rotate(i, 2 * N + 2 * M - 4);
		N -= 2;
		M -= 2;
	}

	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cout << arr[i][j] << " ";
		}
		cout << '\n';
	}
	return 0;
}

 

16926번 문제와 동일한데, 조건 하나만 다르다. R의 범위가 1000에서 10^9까지 늘어났다.

 

배열 돌리기 1 에서는 "각 박스에 대해 1칸 전진"을 R번 반복했다면,

배열 돌리기 2 에서는 "박스 한 개에 대해 R칸 전진"을 박스 개수만큼 반복해줬다.

 

박스 칸 수만큼 돌면 다시 제자리로 오게 되므로 R을 박스 칸 수로 나눈 나머지만큼만 반복하면 된다.

가장 바깥 쪽 박스 칸 수는 2 * n + 2 * m - 4 이고 (-4는 모서리에 반복되는 칸을 뺀 것이다)

박스가 안쪽으로 들어갈 때마다 가로, 세로 길이는 각각 2씩 감소한다.

728x90
반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[BOJ] 13904번 과제 (C++)  (0) 2022.08.16
[BOJ] 2665번 미로 만들기 (C++)  (0) 2022.08.15
[BOJ] 16926번 배열 돌리기 (C++)  (0) 2022.08.11
[BOJ] 7569번 토마토 (C++)  (0) 2022.08.11
[BOJ] 1374번 강의실 (C++)  (0) 2022.08.09