Taaewoo
Data Engineering Blog
Taaewoo
전체 방문자
오늘
어제
  • 분류 전체보기 (67)
    • Computer Science (16)
      • Algorithm (6)
      • OS (1)
      • Java (2)
      • C++ (6)
      • Python (1)
    • Hadoop Ecosystem (27)
      • Hadoop (6)
      • Spark (5)
      • NiFi (6)
      • Hive (9)
      • Kafka (1)
    • BigData Engineering (14)
      • Jupyter (1)
      • Docker (3)
      • CDH (3)
      • Riot Data Pipeline (7)
    • Back-end 개발 (0)
      • Spring (0)
    • Algorithm 문제 풀이 (9)
      • 백준 (5)
      • LeetCode (4)
    • Conference (1)
      • LINE DEVELOPER DAY 2021 (1)
      • if(kakao) 2021 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래밍
  • metastore
  • algorithm
  • NiFi
  • sort
  • 정렬
  • C++
  • kafka
  • Hive
  • docker
  • Coding
  • 알고리즘
  • 빅데이터
  • CS
  • hdfs
  • BigData
  • java
  • hadoop
  • 코딩
  • spark

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Taaewoo

Data Engineering Blog

[C++] 2차원 배열 90도 회전
Computer Science/C++

[C++] 2차원 배열 90도 회전

2021. 1. 23. 16:42

2차원 배열 90도 회전

 2차원으로 선언된 배열을 2중 for문을 이용하여 90도 회전 시킬 수 있습니다.

 

memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 )

 배열간의 값 복사를 할 수 있는 함수로 B의 배열 값들을 A로 복사하는 기능을 제공합니다.

 

관련 글

[C++] 2차원 배열 행렬 바꾸기

 


 

 알고리즘 문제를 풀다보면 2차원 배열을 계속해서 회전시켜야할 때가 있습니다. 90도, 180도, 270도 회전을 시킬 때 각각을 구현하여 문제를 해결할 수 있겠지만, 90도 회전하는 법을 알면 함수로 선언 후 반복적으로 이용하면 됩니다. 이렇게 하는 것이 코드도 깔끔해지고 시간도 절약할 수 있습니다.

 

 2차원 배열을 90도 회전시키는 방법은 2중 for문을 이용해 행렬을 서로 바꿔주면 쉽게 해결할 수 있습니다. 하지만 새로 바뀌어야하는 배열의 index를 정하는 것이 매번 헷갈릴 수 있지만 한번만 익혀두면 많은 알고리즘 문제에서 유용하게 사용할 수 있으니 꼭 공부하시길 바래요.

 

 

90도 회전의 좌표 변화 

 배열을 90도 회전시키기 위한 예시를 하나 만들겠습니다. 5x5의 2차원 배열이 다음과 같이 있다고 가정합시다. 각 숫자들은 Row, Column의 좌표 값을 의미합니다.

 

 

 위의 배열을 시계 방향으로 90도 회전한다고 가정할 때 전체 좌표의 변화 값을 생각하면 복잡하니, 첫번째 열의 좌표 값들이 어떻게 변하는지 보겠습니다.

 

 

 90도 회전 시키기 전의 배열을 A, 회전 이후의 배열을 B라고 가정할 때, 90도 회전 시켰을 때 A의 1열은 B의 1행이 됩니다. A의 1열과 B의 1행의 각 좌표를 비교하기 위해 A 1열을 90도 회전 후 나란히 위치시키겠습니다.

 

 위의 그림을 보면 일단 가장 먼저 A의 Column 값이 B의 Row으로 된다는 것을 쉽게 파악할 수 있습니다. 문제는 A의 Row 값입니다. 자세히 보면 B의 Column 값이 증가함에 따라 A의 Row 값은 감소한다는 것을 알 수 있습니다. 그래서 결론적으로 2차원 배열 B를 표현한다면 다음과 같이 정리할 수 있습니다.

 

B[ B Row ][ B Column ]  = A[ N - B Column - 1 ][ B Row ]

 

 

 배열 값 복사하기

 90도 회전 시 좌표 값의 변화를 알았지만 이 변화된 값들을 어떻게 기존 배열에 넣어줄 수 있을까요? 보통 가장 쉽게 생각한다면 똑같은 크기의 temp 배열을 만든 뒤 2중 for문을 이용해 값을 대입시킬 수 있습니다. 하지만 이렇게 한다면 회전을 위한 2중 for문과 값 복사를 위한 2중 for문이 연달아 사용되기 때문에 지저분한 코딩이 될 수 있습니다. 그런데 배열 간의 값 복사는 이미 함수로 존재한다는 것을 알고 계셨나요?

 

 memmove() 함수를 이용하면 2차원 배열 간의 값 이동을 쉽게 할 수 있습니다. 함수 parameter는 이렇습니다. memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 ) 로 정의되며 2차원 배열 간의 값 복사는 쉽게 생각해서 배열 이름을 넣어주면 됩니다. ( Parameter의 의미를 이해하면 2차원 배열의 특정 행렬 값만 복사시킬 수 있습니다. ) memmove()를 이용한 2차원 배열의 90도 회전의 코드 예시는 아래와 같습니다.

 

 

C++ Code

#include <iostream>
#include <string.h>

using namespace std;

#define N 10

int arr[N][N], temp_arr[N][N];

void init(){
    
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            arr[i][j] = i*10 + j;
            
}

void print_arr(){
    
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            cout.width(2);
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
    
}

int main()
{
    init();
    
    print_arr();
    
    // 배열 90도 회전
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            temp_arr[i][j] = arr[N - j -1][i];
    
    // 배열 값 복사
    memmove(arr, temp_arr, sizeof(arr));
    
    print_arr();
}

 

결과 화면

 

저작자표시 비영리 (새창열림)

'Computer Science > C++' 카테고리의 다른 글

[C++] Split #2 - multiple delimiter split 함수 구현  (0) 2021.02.02
[C++] Split #1 - String delimiter split 함수 구현  (0) 2021.01.28
[C++] 2차원 배열 행렬 바꾸기  (0) 2021.01.25
[C++] 2차원 배열 특정 값 초기화  (0) 2021.01.17
[C++] 구조체 생성자 오버로딩 Struct Constructor Overloading  (0) 2021.01.10
    'Computer Science/C++' 카테고리의 다른 글
    • [C++] Split #1 - String delimiter split 함수 구현
    • [C++] 2차원 배열 행렬 바꾸기
    • [C++] 2차원 배열 특정 값 초기화
    • [C++] 구조체 생성자 오버로딩 Struct Constructor Overloading
    Taaewoo
    Taaewoo

    티스토리툴바