지우너

[코드트리] 기울어진 직사각형의 회전 C++ 본문

Problem Solving

[코드트리] 기울어진 직사각형의 회전 C++

지옹 2024. 6. 5. 11:38

문제

https://www.codetree.ai/missions/2/problems/rotate-slanted-rectangle?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

계획 세우기

그냥 한 줄씩 대각선 이동시켜주면 될 것 같다. dx,dy를 쓰고 싶었는데 반복문 조건을 어떤 식으로 할지 감이 바로 오지 않아서 그냥 풀기로 했다.

반시계 방향을 아래와 같이 구현했다

풀이

#include <iostream>

using namespace std;

int n, r, c, m1, m2, m3, m4, dir;
int arr[101][101];

void GetInput(){
    cin >> n;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> arr[i][j];
        }
    }
    cin >> r >> c >> m1 >> m2 >> m3 >> m4 >> dir;
    r-=1;
    c-=1;
}

void PrintArr(){
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout << arr[i][j] << " ";
        }
        cout << '\n';
    }
}
// (r, c) 회전이 시작되는 아래의 점
// width: m1, m3의 길이, height: m2, m4의 크기
// dir: 0 반시계 방향 회전, 1 시계 방향 회전
void Rotate(){
    if (dir==0){
        // 반시계 회전
        // shift line1
        int lastElementOfL1 = arr[r-m1][c+m1];
        for(int i=m1; i>0; i--){
            // 좌하(1, -1)에 있는 원소를 현재 칸에 넣어야 함
            arr[r-i][c+i]=arr[r-i+1][c+i-1];
        }

        //shift line2
        // [r-m1][c+m1]에서 좌상(-1,-1)으로 height 만큼 가야함
        int lastElementOfL2=arr[r-m1-m2][c+m1-m2];
        for(int i=m2; i>0; i--){
            //우하(1,1)에 있는 원소를 현재 칸에 넣어야 함
            arr[r-m1-i][c+m1-i]=arr[r-m1-i+1][c+m1-i+1];
        }
        arr[r-m1-1][c+m1-1]=lastElementOfL1;

        //shift line3
        // r,c에서 좌상으로 hight만큼 간 값
        int lastElementOfL3=arr[r-m4][c-m4];
        for(int i=0; i<m3; i++){
            // 우상(-1,1)에 있는 값을 마지막 값에서부터 당기기
            arr[r-m4-i][c-m4+i]=arr[r-m4-i-1][c-m4+i+1];
        }
        arr[r-m1-m2+1][c+m1-m2-1]=lastElementOfL2;

        //shift line4
        for(int i=0; i<m4; i++){
            arr[r-i][c-i]=arr[r-i-1][c-i-1];
        }
        arr[r-m4+1][c-m4+1]=lastElementOfL3;

    }
    else{
        // 시계 회전
        // shift line1
        int lastElementOfL1 = arr[r-m4][c-m4];
        for(int i=m4; i>0; i--){
            arr[r-i][c-i]=arr[r-i+1][c-i+1];
        }

        // shift line2
        int lastElementOfL2=arr[r-m4-m3][c-m4+m3];
        for(int i=m3; i>0; i--){
            arr[r-m4-i][c-m4+i]=arr[r-m4-i+1][c-m4+i-1];
        }
        arr[r-m4-1][c-m4+1]=lastElementOfL1;

        // shift line3
        int lastElementOfL3=arr[r-m1][c+m1];
        for(int i=0; i<m2; i++){
            arr[r-m1-i][c+m1-i]=arr[r-m1-i-1][c+m1-i-1];
        }
        arr[r-m4-m3+1][c-m4+m3+1]=lastElementOfL2;

        // shift line4
        for(int i=0; i<m1;i++){
            arr[r-i][c+i]=arr[r-i-1][c+i+1];
        }
        arr[r-m1+1][c+m1-1]=lastElementOfL3;
    }
}

int main() {
    GetInput();

    Rotate();

    PrintArr();
    return 0;
}