백준의 배열돌리기3(16935) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
1) 단순히 배열을 문제에서 제시한 방향으로 돌리면 되는 문제이다.
본인은 이런 유형의 문제들이 나오면 항상 또 하나의 임시저장할 맵을 만들어서, 원래의 맵에서 연산에 따라서 옮겨지는
값들을 임시저장에 저장 후 , 임시저장한 맵을 최종적으로 다시 원래의 맵에 옮겨준다.
이 문제에서 특히 주의해야 할 연산은 3, 4번 연산이라고 생각한다.
3, 4번 연산이 진행될 경우, 맵의 가로와 세로 길이가 바뀌게 된다.
예를 들어서 원래의 맵이 2 x 4 일 경우, 3번 or 4번 연산을 진행하게 되면 4 x 2가 되고, 그 이후에 또 한번
3번 or 4번 연산을 진행하게 되면 2 x 4가 된다. 이런식으로 N, M의 길이가 바뀌니 주의하자.
이렇게 배열을 돌리는 것은 인덱스 계산만 신경써서 잘 해주면 문제 없이 해결할 수 있기도 하고, 또한 이러한 과정을
말로 설명하기에는 너무 어렵고 정신 없어질 수 있다. 따라서 소스코드를 참고하는 편이 더 낫다고 생각해서 별 다른
설명은 적지 않고 바로 소스코드를 첨부하겠다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | #include<iostream> #include<vector> #define endl "\n" #define MAX 100 using namespace std; int N, M, K; int MAP[MAX][MAX]; int C_MAP[MAX][MAX]; vector<int> V; void Input() { cin >> N >> M >> K; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> MAP[i][j]; } } for (int i = 0; i < K; i++) { int a; cin >> a; V.push_back(a); } } void Print() { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cout << MAP[i][j] << " "; } cout << endl; } } void Copy_MAP(int A[][MAX], int B[][MAX]) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { A[i][j] = B[i][j]; } } } void Cmd_One() { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { C_MAP[N - i - 1][j] = MAP[i][j]; } } Copy_MAP(MAP, C_MAP); } void Cmd_Two() { for (int j = 0; j < M; j++) { for (int i = 0; i < N; i++) { C_MAP[i][M - 1- j] = MAP[i][j]; } } Copy_MAP(MAP, C_MAP); } void Cmd_Three() { int NN = N; swap(N, M); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { C_MAP[i][j] = MAP[NN - 1 - j][i]; } } Copy_MAP(MAP, C_MAP); } void Cmd_Four() { int MM = M; swap(N, M); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { C_MAP[i][j] = MAP[j][MM - 1 - i]; } } Copy_MAP(MAP, C_MAP); } void Cmd_Five() { int Half_N = N / 2; int Half_M = M / 2; /* 1번을 2번으로 */ for (int i = 0; i < Half_N; i++) { for(int j = 0; j < Half_M; j++) { C_MAP[i][j + Half_M] = MAP[i][j]; } } /* 2번을 3번으로 */ for (int i = 0; i < Half_N; i++) { for (int j = Half_M; j < M; j++) { C_MAP[i + Half_N][j] = MAP[i][j]; } } /* 3번을 4번으로 */ for (int i = Half_N; i < N; i++) { for (int j = Half_M; j < M; j++) { C_MAP[i][j - Half_M] = MAP[i][j]; } } for (int i = Half_N; i < N; i++) { for (int j = 0; j < Half_M; j++) { C_MAP[i - Half_N][j] = MAP[i][j]; } } Copy_MAP(MAP, C_MAP); } void Cmd_Six() { int Half_N = N / 2; int Half_M = M / 2; /* 1번을 4번으로 */ for (int i = 0; i < Half_N; i++) { for (int j = 0; j < Half_M; j++) { C_MAP[i + Half_N][j] = MAP[i][j]; } } /* 4번을 3번으로 */ for (int i = Half_N; i < N; i++) { for (int j = 0; j < Half_M; j++) { C_MAP[i][j + Half_M] = MAP[i][j]; } } /* 3번을 2번으로 */ for (int i = Half_N; i < N; i++) { for (int j = Half_M; j < M; j++) { C_MAP[i - Half_N][j] = MAP[i][j]; } } /* 2번을 1번으로 */ for (int i = 0; i < Half_N; i++) { for (int j = Half_M; j < M; j++) { C_MAP[i][j - Half_M] = MAP[i][j]; } } Copy_MAP(MAP, C_MAP); } void Solution() { for (int i = 0; i < V.size(); i++) { int Cmd = V[i]; if (Cmd == 1) Cmd_One(); else if (Cmd == 2) Cmd_Two(); else if (Cmd == 3) Cmd_Three(); else if (Cmd == 4) Cmd_Four(); else if (Cmd == 5) Cmd_Five(); else Cmd_Six(); } Print(); } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 1102 ] 발전소 (C++) (0) | 2020.03.03 |
---|---|
[ 백준 2098 ] 외판원 순회 (C++) (4) | 2020.03.02 |
[ 백준 1248 ] 맞춰봐 (C++) (0) | 2020.03.01 |
[ 백준 2424 ] 부산의 해적 (C++) (0) | 2020.02.29 |
[ 백준 2169 ] 로봇 조종하기 (C++) (0) | 2020.02.28 |