코딩테스트/SWExpertAcademy

숫자 배열 회전 C++(SW Expert Academy)

멍토 2020. 2. 10.

난이도 : D2

문제번호 : 1961

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pq-OKAVYDFAUq&categoryId=AV5Pq-OKAVYDFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

N x N 행렬이 주어질 때,

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

 

제약사항

N은 3 이상 7 이하이다.

입력

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

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

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

출력

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

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

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

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

예시

입력 출력
2
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

2. 문제풀이

D2에서 어려웠던 문제였던거 같습니다.

출력이 왜저렇게 되는지 이해가 되지 않았거든요.

갑자기 741이 어디서 나온건지...

근데 나중에봤더니 90도 180도 270도 회전한걸 붙여서 출력한것이더라구요

이제 문제를 이해했으니 풀이를 했습니다.

 

먼저 배열을 회전하는 함수를 만들었습니다.

90도를 회전하는 함수입니다.

한번 회전할때마다 값을 저장하고

총 3번을 회전합니다.

배열을 회전하는 방식은 코드로 작성했으니 확인해보세요.

 


3. 소스코드

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
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
//배열회전함수
void spin_arr(int N, vector<vector<string>> &arr) {
    vector<vector<string>> temp(N, vector<string>(N, ""));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            temp[i][j] = arr[abs(j - (N - 1))][i];
    }
    arr = temp;
}
 
int main() {
    int len;
    cin >> len;
    //입력받은 횟수만큼 반복
    for (int l = 1; l <= len; l++) {
        int N, row = 0, cul = 0;
        cin >> N;
        //입력받은 배열과 결과배열
        vector<vector<string>> arr(N, vector<string>(N, "")), result(N, vector<string>(N, ""));
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++)
                cin >> arr[i][j];
        }
        //배열은 총 3번 회전시킨다.
        for (int l = 0; l < 3; l++) {
            spin_arr(N, arr);
            row = 0;
            //회전시킨후 결과저장
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++
                    result[row][cul] += arr[i][j];
                row++;
            }
            cul++;
        }
        //출력
        cout << "#" << l << endl;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++)
                cout << result[i][j] << " ";
            cout << endl;
        }
    }
    return 0;
}

댓글

💲 광고입니다.