-
백준(BOJ) 16935번 배열 돌리기 3알고리즘 풀이/백준(Boj) 2019. 12. 1. 02:45
문제 : https://www.acmicpc.net/problem/16935
16935번: 배열 돌리기 3
크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 → 7 4 6 2 3 1 7 4 6 2 3 1 → 1 8 3 4 2 9 9 2 3 6 1 5 → 7 2 6 9 8 2 4 2 9 3 1 8 → 1 6 2 9 8 4 <배열> <연산 결과> 2번 연
www.acmicpc.net
풀이 :
각각의 조건을 맞춰 1~6까지 여분의 배열 temp를 생성해 변형시켜주자.
3,4번째 에서는 가로와 세로가 달라지기 때문에 swap()을 통해 바꾸어 주는 것에 유의하자.
코드 ( C++ )
This file contains 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 <iostream> #include <algorithm> #include <vector> #include <cstring> using namespace std; int n, m, r; int a[100][100]; int temp[100][100]; void one() { memset(temp, 0, sizeof(temp)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) temp[i][j] = a[n - 1 - i][j]; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = temp[i][j]; } void two() { memset(temp, 0, sizeof(temp)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) temp[i][j] = a[i][m - 1 - j]; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = temp[i][j]; } void three() { memset(temp, 0, sizeof(temp)); int h = n; swap(n, m); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) temp[i][j] = a[h - 1 - j][i]; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = temp[i][j]; } void four() { memset(temp, 0, sizeof(temp)); int w = m; swap(n, m); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) temp[i][j] = a[j][w-1-i]; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = temp[i][j]; } void five() { memset(temp, 0, sizeof(temp)); int N = n / 2; int M = m / 2; for(int i=0; i<N; ++i) for (int j = 0; j < M; ++j) { temp[i][j+M] = a[i][j]; } for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { temp[i+N][j + M] = a[i][j+M]; } for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { temp[i+N][j] = a[i+N][j+M]; } for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { temp[i][j] = a[i+N][j]; } for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = temp[i][j]; } void six() { memset(temp, 0, sizeof(temp)); int N = n / 2; int M = m / 2; //4번을 3번으로 for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { temp[i + N][j + M] = a[i + N][j]; } // 3번을 2번으로 for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { temp[i][j + M] = a[i + N][j + M]; } // 1번을 4번으로 for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { temp[i + N][j] = a[i][j]; } //2번을 1번으로 for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { temp[i][j] = a[i][j+M]; } for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = temp[i][j]; } int main() { bool w = false, h = false; cin >> n >> m >> r; if (n <= m) w = true; for(int i=0; i<n; ++i) for (int j = 0; j < m; ++j) { cin >> a[i][j]; } for (int i = 0; i < r; ++i) { int num; cin >> num; if (num == 1) one(); else if (num == 2) two(); else if (num == 3) three(); else if (num == 4) four(); else if (num == 5) five(); else if (num == 6) six(); } for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) cout << a[i][j] << " "; cout << "\n"; } return 0; } '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 16917번 양념 반 후라이드 반 (0) 2019.12.08 백준(BOJ) 16988번 Baaaaaaaaaduk2 (Easy) (0) 2019.12.02 백준(BOJ) 16987번 계란으로 계란치기 (0) 2019.11.30 백준(BOJ) 16939번 2x2x2 큐브 (0) 2019.11.30 백준(BOJ) 16235번 나무 재테크 (0) 2019.11.26