오답노트

[시뮬레이션] BOJ 16926번 배열 돌리기 1 본문

C,C++/코딩테스트

[시뮬레이션] BOJ 16926번 배열 돌리기 1

권멋져 2022. 5. 25. 17:52
https://www.acmicpc.net/problem/16926
 

16926번: 배열 돌리기 1

크기가 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

- 문제파악

NxM 배열이 주어지고 가장 밖에 원소들부터 안쪽으로 반시계 방향으로 요소들을 한 칸씩 옮긴 결과를 출력하라

 

- 정답

디버그 모드로 돌려서 노가다 했다.

 

#include "bits/stdc++.h"

using namespace std;

int n, m, t;
int arr[305][305];
int arr_tmp[305][305];

void T2B(int x, int y, int dn, int dm)
{
	for (int i = x; i < dn - 1; i++)
	{
		arr_tmp[i + 1][y] = arr[i][y];
	}
}

void L2R(int x, int y, int dn, int dm)
{
	for (int i = y; i < dm - 1; i++)
	{
		arr_tmp[x][i + 1] = arr[x][i];
	}
}

void B2T(int x, int y, int dn, int dm)
{
	for (int i = dn - 1; i > x; i--)
	{
		arr_tmp[i - 1][y] = arr[i][y];
	}
}

void R2L(int x, int y, int dn, int dm)
{
	for (int i = dm - 1; i > y; i--)
	{
		arr_tmp[x][i - 1] = arr[x][i];
	}
}

int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	cin >> n >> m >> t;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> arr[i][j];
		}
	}

	while (t--)
	{
		int dn = n;
		int dm = m;
		int dx = 0;
		int dy = 0;
		while (dx < dn && dy < dm )
		{
			T2B(dx, dy, dn, dm);
			L2R(n - dx - 1, dy, dn, dm);
			B2T(dx, m - dy - 1, dn, dm);
			R2L(dx, dy, dn, dm);
			dx++;
			dy++;
			dn--;
			dm--;
		}

		memcpy(arr, arr_tmp, sizeof(int) * 305 * 305);

	}


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

}