본문 바로가기
C++ 알고리즘

SWEA D2 1961. 숫자 배열 회전

by hoshi03 2024. 10. 11.

N x N 행렬이 주어질 때,

시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.


[제약 사항]

N은 3 이상 7 이하이다.

[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 번째 줄에 N이 주어지고,

다음 N 줄에는 N x N 행렬이 주어진다.

[출력]

출력의 첫 줄은 '#t'로 시작하고,

다음 N줄에 걸쳐서 90도, 180도, 270도 회전한 모양을 출력한다.

입력과는 달리 출력에서는 회전한 모양 사이에만 공백이 존재함에 유의하라.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

입력10
3
1 2 3
4 5 6
7 8 9
6
6 9 4 7 0 5
8 9 9 2 6 5
6 8 5 4 9 8
2 2 7 7 8 4
7 5 1 9 7 9
8 9 3 9 7 6

 
 
출력#1
741 987 369
852 654 258
963 321 147
#2
872686 679398 558496
952899 979157 069877
317594 487722 724799
997427 894586 495713
778960 562998 998259
694855 507496 686278

 

 

• 풀이

 

별찍기 느낌으로 열심히 돌린후 한번에 출력하면 좋겠지만 출력값이 까다로웠다

n * n 크기로 입력받으면 출력은 n줄이 되기에 string n개를 만들어주고

2중 for문으로 순회할때 바깥쪽 for문 i에 해당하는 string[i] 에 내부 for문에서 나온 숫자 n개와 스페이스를 추가하는 식으로

입력을 저장해두고

마지막에 출력하는 형식으로 풀었다

 

#include <iostream>
#include <vector>
using namespace std;


int main () {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int test_case;
    cin >> test_case;
    for(int t = 1; t <= test_case; t++){
        int n;
        cin >> n;
        vector<vector<int>> arr(n,vector<int> (n,0));

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

        vector<string> res(n,"");

        int cnt = 0;

        for(int i = n - 1; i >= 0; i--){
            string temp = "";
            for(int j = n-1; j >= 0; j--){
                temp += to_string(arr[j][n-i-1]);
            }
            cnt %= n;
            res[cnt++] += temp += " ";
        }

        cnt = 0;

        for(int i = n - 1; i >= 0; i--){
            string temp = "";
            for(int j = n-1; j >= 0; j--){
                temp += to_string(arr[i][j]);
            }
            cnt %= n;
            res[cnt++] += temp += " ";
        }

        cnt = 0;

        for(int i = n-1; i >= 0; i--){
            string temp = "";
            for(int j = n-1; j >= 0; j--){
                temp += to_string(arr[n-j-1][i]);
            }
            cnt %= n;
            res[cnt++] += temp += " ";
        }

        cout << "#" << t << '\n';

        for(string x : res){
            cout << x << '\n';
        }
    }
}

 

- -채찍피티 코드

굳이 2중 for문 3개를 쓸 필요없이 하나 안에서 처리해서 훨씬 깔끔해보인다

#include <iostream>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int test_case;
    cin >> test_case;
    for (int t = 1; t <= test_case; t++) {
        int n;
        cin >> n;
        vector<vector<int>> arr(n, vector<int>(n, 0));

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

        cout << "#" << t << '\n';

        // 한 번의 루프에서 90도, 180도, 270도 회전값을 한꺼번에 구함
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 90도 회전: arr[n-j-1][i]
                cout << arr[n - j - 1][i];
            }
            cout << " ";
            for (int j = 0; j < n; j++) {
                // 180도 회전: arr[n-i-1][n-j-1]
                cout << arr[n - i - 1][n - j - 1];
            }
            cout << " ";
            for (int j = 0; j < n; j++) {
                // 270도 회전: arr[j][n-i-1]
                cout << arr[j][n - i - 1];
            }
            cout << '\n';
        }
    }
}

'C++ 알고리즘' 카테고리의 다른 글

1288. 새로운 불면증 치료법 D2  (1) 2024.10.12
SWEA D2 1959. 두 개의 숫자열  (0) 2024.10.12
SWEA D2 2005 파스칼의 삼각형  (0) 2024.10.11
SWEA D2 1926 간단한 369  (0) 2024.10.10
SWEA D2 1954 달팽이 숫자  (0) 2024.10.10