16935 배열 돌리기 3
풀이코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;
// 16935 배열 돌리기 3
const int MAX = 100;
int n, m, r;
int cal[1000];
vector<vector<int>> solve1(vector<vector<int>> arr){
int n = arr.size();
int m = arr[0].size();
vector<vector<int>> tmp(n, vector<int>(m));
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
tmp[i][j] = arr[abs(n - 1 - i)][j];
}
}
return tmp;
}
vector<vector<int>> solve2(vector<vector<int>> arr){
int n = arr.size();
int m = arr[0].size();
vector<vector<int>> tmp(n, vector<int>(m));
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
tmp[i][j] = arr[i][abs(m - 1- j)];
}
}
return tmp;
}
vector<vector<int>> solve3(vector<vector<int>> arr){
int n = arr.size();
int m = arr[0].size();
vector<vector<int>> tmp(m, vector<int>(n));
/*
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
tmp[i][j] = arr[n-j-1][i];
}
}
*/
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
tmp[j][n - 1 - i] = arr[i][j];
}
}
return tmp;
}
vector<vector<int>> solve4(vector<vector<int>> arr){
int n = arr.size();
int m = arr[0].size();
vector<vector<int>> tmp(m, vector<int>(n));
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
tmp[i][j] = arr[j][m-i-1];
}
}
return tmp;
}
vector<vector<int>> solve5(vector<vector<int>> arr){
int n = arr.size();
int m = arr[0].size();
vector<vector<int>> tmp(n, vector<int>(m));
for(int i = 0; i < n/2; i++){
for(int j = 0; j < m/2; j++){
tmp[i][j + m / 2] = arr[i][j];
tmp[i + n / 2][j + m / 2] = arr[i][j + m / 2];
tmp[i][j] = arr[i + n / 2][j];
tmp[i + n / 2][j] = arr[i + n / 2][j + m / 2];
}
}
return tmp;
}
vector<vector<int>> solve6(vector<vector<int>> arr){
int n = arr.size();
int m = arr[0].size();
vector<vector<int>> tmp(n, vector<int>(m));
for(int i = 0; i < n/2; i++){
for(int j = 0; j < m/2; j++){
tmp[i+n/2][j] = arr[i][j];
tmp[i][j] = arr[i][j+m/2];
tmp[i][j+m/2] = arr[i+n/2][j+m/2];
tmp[i+n/2][j+m/2] = arr[i+n/2][j];
}
}
return tmp;
}
int main(){
cin >> n >> m >> r;
vector<vector<int>> arr(n, vector<int>(m));
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> arr[i][j];
}
}
for(int i = 0; i < r; i++) cin >> cal[i];
for(int op : cal){
switch(op){
case 1:
arr = solve1(arr);
break;
case 2:
arr = solve2(arr);
break;
case 3:
arr = solve3(arr);
break;
case 4:
arr = solve4(arr);
break;
case 5:
arr = solve5(arr);
break;
case 6:
arr = solve6(arr);
break;
}
}
for(int i = 0; i < arr.size(); i++){
for(int j = 0; j < arr[0].size(); j++){
cout << arr[i][j] << ' ';
}
cout << '\n';
}
}
해설
적용한 레시피 / 방법론 + 접근법
풀이
1. 6개의 연산을 어떻게 구현할 것인가.
- 원래 배열을 A[i][j]. 연산 결과인 배열을 B[k][l] 이라면 둘 간의 관계를 살펴보아야 한다.
1번째 연산을 예로 들어보자.B[i][j] = A[abs((n - 1) - i)][j]라 할 수 있다.나머지 연산들에 대해서도 위와 같은 식을 세워 배열 B 를 구할 수 있다.
1-1. 연산식을 쓸 때 주의해야 할 점은, 기준을 누구로 잡을 것이냐 이다.
만약 기존의 배열 a 를 기준으로 잡는다고 하면 3번 연산은 아래와 같을 것이다.
B[j][n - 1 - i] = A[i][j]
하지만, b 를 기준으로 잡는다면
B[i][j] = A[n - 1 - j][i]
가 된다.
이에 따라, 조건문을 도는 i 와 j 의 범위도 바꿔줘야 함을 명심하자.
아쉬웠던 부분 / 오답 원인 / 개선해야 할 점
각 연산의 연산식들은 공책에 써가며, 쉽게 풀 수 있었다.
문제는
1. 3, 4 번 연산을 할 때, 배열의 n, m 즉, 가로 세로 길이가 바뀌는 것을 간과했다.
2. 3, 4 번 연산을 하고 난 뒤에도 가로 세로 길이가 바뀌므로, 출력 시 기존의 n 과 m 이 아닌 현재 배열의 n 과 m 을 새로 구하여 했어야 했다.
반응형
'ps > 구현' 카테고리의 다른 글
[프로그래머스] 신규 아이디 추천 (2021 카카오 블라인드 채용) (0) | 2022.02.04 |
---|---|
[구현] 로봇 청소기 14503 (0) | 2021.10.09 |
[구현] 톱니바퀴 14891 (0) | 2021.10.06 |
[구현] 주사위 굴리기 14499 (0) | 2021.10.04 |
[구현] 배열 돌리기 1 16926 (0) | 2021.10.04 |