본문 바로가기

PS/BaekJoon

[백준/c++] 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]
   ↓         ↓                   ↑         ↑
A[3][1]   A[3][2] → A[3][3] → A[3][4]   A[3][5]
   ↓                                       ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]

예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.

1 2 3 4       2 3 4 8       3 4 8 6
5 6 7 8       1 7 7 6       2 7 8 2
9 8 7 6   →   5 6 8 2   →   1 7 6 3
5 4 3 2       9 5 4 3       5 9 5 4
 <시작>         <회전1>        <회전2>

배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.

입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.

제한

  • 2 ≤ N, M ≤ 300
  • 1 ≤ R ≤ 1,000
  • min(N, M) mod 2 = 0
  • 1 ≤ Aij ≤ 108

구현해야할 조건

배열의 반대방향으로 돌리는 것이고 안에 있는 값까지 돌리는 것이기 때문에 구현하기엔 좀 까다롭다고 생각한다. 생각하기 전에는 생각 후에는 1사분면부터 4사분면으로 생각한 꼭지점에 맞춰서 점점 줄어든다고 생각하면 된다!

말이 어렵다고 느껴진다면 내 잘못이니 코드를 보도록 합시다!

#include<iostream>

#define MAX 300 + 1
using namespace std;

int N,M,R;
int map[MAX][MAX];

int main()
{
	cin >> N >> M >> R;
	
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
		{
			cin >> map[i][j];
		}
	}
	
	while(R--)
	{
		int four_x = 0;
		int four_y = 0;
        // 4
		int one_x = 0;
		int one_y = M-1;
        // 1
		int two_x = N-1;
		int two_y = M-1;
        // 2
		int three_x = N-1;
		int three_y = 0;
		// 3
        
		while(four_x < three_x && four_y < one_y) // 4사랑 3사랑 안돼 4사랑 1사랑 안돼
		{
			int temp = map[four_x][four_y];
			
			for(int i = four_y; i < one_y; i++)
			{
				map[four_x][i] = map[four_x][i+1];
			}
			for(int i = one_x; i < two_x; i++)
			{
				map[i][one_y] = map[i+1][one_y];
			}
			for(int i = two_y; i > three_y; i--)
			{
				map[two_x][i] = map[two_x][i-1];
			}
			for(int i = three_x; i > four_x; i--)
			{
				map[i][three_y] = map[i-1][three_y];
			}
			map[four_x+1][three_y] = temp;
			
			four_x += 1;
			four_y += 1;
			one_x += 1;
			one_y -= 1;
			two_x -= 1;
			two_y -= 1;
			three_x -= 1;
			three_y += 1;
			
		}	
	}
	
	for(int i = 0 ; i < N; i++)
	{
		for(int j = 0; j < M; j++)
		{
			cout << map[i][j] << " ";
		}
		cout << "\n";
	}
	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[백준/c++] 16935 배열 돌리기 3  (0) 2022.03.11
[백준/c++] 16927 배열 돌리기 2  (0) 2022.03.10
[백준/c++] 1697 숨바꼭질  (0) 2022.03.10
[백준/c++] 7576 토마토  (0) 2022.03.09
[백준/c++] 2667 단지번호붙이기  (0) 2022.03.09