https://www.acmicpc.net/problem/20327
20327번: 배열 돌리기 6
크기가 2N×2N인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 8가지가 있고, 연산에는 단계 ℓ (0 ≤ ℓ < N)이 있다. 단계 ℓ은 배열을 부분 배열로 나눌때 사용하는 값이며, 부분
www.acmicpc.net
철저한 구현 문제이다. 배열의 각 성분마다 돌린 후의 위치를 계산하여 배열을 돌린 각 결과를 저장한 뒤, 배열을 모두 돌린 후의 결과를 출력하면 된다.
#include <cstdio>
#define MAX_N 7
#define pow(i) (1 << i)
// N: 배열의 크기, R: 명령의 개수, k: 각 명령, l: 명령의 실행 단위
int N, R, k, l;
// arr[b % 2]: 배열을 b번 돌린 결과
short arr[2][pow(MAX_N)][pow(MAX_N)];
void step(bool b, int y, int x) {
// y_, x_: k와 l에 따라 배열의 y + i, x + j를 돌린 후의 위치
int y_ = y, x_ = x;
// 배열을 돌린 뒤의 위치를 각각 계산한 뒤 이동
for (int i = 0; i < l; i++) for (int j = 0; j < l; j++) {
if (k == 1) {
y_ = y + (l - 1) - i;
x_ = x + j;
}
else if (k == 2) {
y_ = y + i;
x_ = x + (l - 1) - j;
}
else if (k == 3) {
y_ = y + j;
x_ = x + (l - 1) - i;
}
else if (k == 4) {
y_ = y + (l - 1) - j;
x_ = x + i;
}
else if (k == 5) {
y_ = (N - l) - y + i;
x_ = x + j;
}
else if (k == 6) {
y_ = y + i;
x_ = (N - l) - x + j;
}
else if (k == 7) {
y_ = x + i;
x_ = (N - l) - y + j;
}
else if (k == 8) {
y_ = (N - l) - x + i;
x_ = y + j;
}
// 배열을 돌린 결과를 다른 곳에 저장
arr[!b][y_][x_] = arr[b][y + i][x + j];
}
}
int main() {
// 문제의 조건을 각각 입력받은 뒤
scanf("%d %d", &N, &R);
// N은 2 ^ N 꼴로 변경
N = pow(N);
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++)
scanf("%hd", arr[0][i] + j);
// 각 명령에 대해
for (int r = 0; r < R; r++) {
// 명령과 수행 단위를 입력받은 뒤
scanf("%d %d", &k, &l);
// l은 2 ^ l 꼴로 변경
l = pow(l);
// 각 단위를 차례차례 이동
for (int i = 0; i < N; i += l) for (int j = 0; j < N; j += l)
step(r % 2, i, j);
}
// 배열을 돌린 결과를 출력
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) printf("%hd ", arr[R % 2][i][j]);
printf("\n");
}
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
백준 16564번: 히오스 프로게이머 (0) | 2022.05.27 |
---|---|
백준 15653번: 구슬 탈출 4 (0) | 2022.05.15 |
백준 17471번: 게리맨더링 (0) | 2022.05.07 |
백준 20005번: 보스몬스터 전리품 (0) | 2022.05.06 |
백준 6957번: 트리 복구 (0) | 2022.05.05 |