메모리
시간
1824 KB
284 ms
Code
#include <cstdio>
#include <algorithm>
using namespace std;
int arr[301][301];
int new_arr[301][301];
//위 오 왼 위
int xm[4] = {1, 0, -1, 0};
int ym[4] = {0, 1, 0, -1};
void change(int n, int m, int count)
{
for (int i = 0; i < count; i++)
{
int j = 0;
int x = i;
int y = i;
while (1)
{
new_arr[x + xm[j]][y + ym[j]] = arr[x][y];
x = x + xm[j];
y = y + ym[j];
if (x == i && y == i)
break ;
//방향이 꺾이는 조건
if ((x == n - i && y == i) || (x == n - i && y == m - i) ||
(x == i && y == m - i))
j++;
}
}
}
int main()
{
int n,m,r;
scanf("%d%d%d",&n,&m,&r);
//몇바꾸 돌건지
int count = min(n,m)/2;
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++)
{
change(n - 1,m - 1, count);
for (int z = 0; z < n; z++)
{
for (int j = 0; j < m; j++)
arr[z][j] = new_arr[z][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
return 0;
}
C++
복사
문제 풀이
<삽질>
처음에 min(n,m)/2 를 구해 한 변씩 if 문으로 넣어가는 방식으로 구현했으나 놓치는 부분을 찾을 수 없어서 다시 구조를 짰다.
큰 사각형에서 한바퀴를 돌고 안쪽 사각형을 도는 방식으로 구현했다.
방향을 설정해주는 int xm[4] = {1, 0, -1, 0}; / int ym[4] = {0, 1, 0, -1}; 배열을 생성해 방향을 바꿀 조건을 만나면 다음인덱스로 넘어간다.
지속해서 바꿔주다 0,0 / 1,1 ... 등을 만나면 다음 사각형을 돌리는 방식으로 구현했다.
이차원 배열을 하나 더 선언해서 옮겨담는 방식으로 하였으나 비효율적이라 임시 int를 따로 선언해 넣어주는 방식이 더 좋은 구현일 것이다.