[SWEA] C++ 1961. 숫자 배열 회전(D2)

swb·2022년 11월 19일
0

SWEA

목록 보기
16/19

문제 바로가기

접근 방법

  • 출력 부분이 이해 안 됐었는데 1행에 90도, 2행에 180도, 3행에 270도 회전한 값을 출력하는 것이다.
  1. 일단 90도로 회전할 때 발생하는 인덱스 변화에 대한 규칙을 찾아야 한다. 다음은 N이 3인 배열과 인덱스다.

    차례로 90, 180, 270도 회전 한 것이다.
90도 회전하는 과정
1(00) -> 7(20)
2(01) -> 4(10)
3(02) -> 1(00)

4(10) -> 8(21)
5(11) -> 5(11)
6(12) -> 2(01)

이제 규칙이 보인다.
i는 N-1부터 감소하고 j는 i의 값을 가진다.

  1. 복사를 위해 입력받은 배열과 크기가 같은 배열 하나를 준비하여 그곳에 입력받은 배열을 회전한 값을 넣는다. 이 과정을 3번 반복한다.

  2. 주의할 점은 입력받은 배열은 90도 돌린 값으로 초기화해줘야 한다.

  3. 출력은 새로운 string배열을 만든다.
    string 행에 90도 돌린 행들을 모두 합치는 형태로 해야 한다.
    예를 들어

    string 1행은 741 즉, [0][0] = 741, [1][0] = 852, [2][0] = 963이 된다.

풀이

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstdio>
#include <math.h>
using namespace std;

int tc, T, N;

int main() {
	cin >> T;

	for (tc = 1; tc <= T; tc++) {
		cin >> N;

		int arr[8][8];
		int copy_arr[8][8];
		string answer[8][8] = { "", };

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				cin >> arr[i][j];
			}
		}

		for (int r = 0; r < 3; r++) { // 90, 180, 270 이기 때문에 총 3번 회전
			for (int i = 0; i < N; i++) {
				for (int j = 0, k = N - 1; j < N, k >= 0; j++, k--) {
					copy_arr[i][j] = arr[k][i]; // 90도 회전
				}
			}
			copy(&copy_arr[0][0], &copy_arr[0][0] + 8 * 8, &arr[0][0]); // arr에 copy_arr을 deep copy

			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					answer[i][r] += to_string(copy_arr[i][j]);
				}
			}
		}

		cout << "#" << tc << "\n";
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				cout << answer[i][j] << " ";
			}
			cout << "\n";
		}
	}
	return 0;
}
profile
개발 시작

0개의 댓글