Search
Duplicate
🙆🏻‍♀️

배열 돌리기 1

주차
14
문제번호
16926
언어
C++
티어
실버
유형
구현
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

메모리

시간

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를 따로 선언해 넣어주는 방식이 더 좋은 구현일 것이다.