16926 배열 돌리기
2019. 9. 1. 10:17ㆍ알고리즘/백준
배열이 돌아가는 규칙을 찾는 문제
먼저 크게 돌리는 횟수는 n, m의 최솟값을 2로 나눈 값이다. 예를 들어 n = 6, m = 4라면 2배열만 돌리게 된다. 규칙을 찾고 나서는 덱을 이용해서 데이터를 넣고, 돌리는 횟수 % 데이터의 개수를 해서 최대한 효율적으로 돌리도록 했다
문제: https://www.acmicpc.net/problem/16926
깃허브주소: https://github.com/surinoel/boj/blob/master/16926.cpp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <deque> | |
#include <iostream> | |
#include <algorithm> | |
using namespace std; | |
int n, m, r; | |
int mat[300][300]; | |
void rotate() { | |
for (int k = 0; k < min(n, m) / 2; k++) { | |
deque<int> dq; | |
int sx, sy; | |
sx = sy = k; | |
int cnt = 0; | |
for (int j = sy; j < sy + (m - (k * 2)); j++) { | |
dq.push_back(mat[sx][j]); | |
cnt += 1; | |
} | |
for (int i = sx + 1; i < sx + 1 + (n - 2) - k * 2; i++) { | |
dq.push_back(mat[i][m - 1 - k]); | |
cnt += 1; | |
} | |
for (int j = sy + (m - (k * 2)) - 1; j >= sy; j--) { | |
dq.push_back(mat[n - k - 1][j]); | |
cnt += 1; | |
} | |
for (int i = sx + (n - 2) - k * 2; i >= sx + 1; i--) { | |
dq.push_back(mat[i][sy]); | |
cnt += 1; | |
} | |
for (int i = 0; i < r%cnt; i++) { | |
int val = dq.front(); | |
dq.pop_front(); | |
dq.push_back(val); | |
} | |
for (int j = sy; j < sy + (m - (k * 2)); j++) { | |
mat[sx][j] = dq.front(); | |
dq.pop_front(); | |
} | |
for (int i = sx + 1; i < sx + 1 + (n - 2) - k * 2; i++) { | |
mat[i][m - 1 - k] = dq.front(); | |
dq.pop_front(); | |
} | |
for (int j = sy + (m - (k * 2)) - 1; j >= sy; j--) { | |
mat[n - k - 1][j] = dq.front(); | |
dq.pop_front(); | |
} | |
for (int i = sx + (n - 2) - k * 2; i >= sx + 1; i--) { | |
mat[i][sy] = dq.front(); | |
dq.pop_front(); | |
} | |
} | |
} | |
int main(void) { | |
ios_base::sync_with_stdio(false); | |
cin.tie(nullptr); | |
cin >> n >> m >> r; | |
for (int i = 0; i < n; i++) { | |
for (int j = 0; j < m; j++) { | |
cin >> mat[i][j]; | |
} | |
} | |
rotate(); | |
for (int i = 0; i < n; i++) { | |
for (int j = 0; j < m; j++) { | |
cout << mat[i][j] << ' '; | |
} | |
cout << '\n'; | |
} | |
return 0; | |
} |
'알고리즘 > 백준' 카테고리의 다른 글
6064 카잉 달력 (0) | 2019.09.02 |
---|---|
16234 인구 이동 (0) | 2019.09.02 |
1107 리모컨 (0) | 2019.08.31 |
백준 N과 M 시리즈 코드 (0) | 2019.08.31 |
11723 집합 (0) | 2019.08.31 |