[C++] 1차원 배열 및 전처리기 다루기 : 0도, 90도(왼쪽/오른쪽), 180도 회전

amudomolla·2023년 6월 3일
0

C++

목록 보기
9/12
post-thumbnail

참고 사이트


1. 배열에 값 할당

cout.width : 출력 자릿수 설정
cout.fill() : 출력 자릿수 미만일 시, 대신 채울 숫자 혹은 문자 설정

#include <iostream>
#define SOURCE_WIDTH 4
#define SOURCE_HEIGHT 8

int SOURCE_BUF[SOURCE_WIDTH*SOURCE_HEIGHT];  // 전역변수

// 배열 값 할당
void buf_fill() {

#if 1

    // 배열에 값(1~32) 할당
    for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
        SOURCE_BUF[i] = i+1;
    }
// #if 0 일 경우 #else가 활성화
#else
    // 배열에 'ㄱ' 그림 데이터 삽입
    for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
        // 기본 출력 첫 행과 마지막 열 위치에 11 저장
        if(i < SOURCE_WIDTH || i % SOURCE_WIDTH == SOURCE_WIDTH-1) {
            SOURCE_BUF[i] = 11;
        }
        // 그 외 위치에 0 저장
        else {
            SOURCE_BUF[i] = 0;
        }
    }
#endif  // SOURCE_WIDTH
}

int main()
{
    std::cout << "배열 확인" << '\n';
    buf_fill();
    for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
        // 출력이 두 자리 미만 => 0으로 채움
        std::cout.width(2);
        std::cout.fill('0');
        std::cout << SOURCE_BUF[i];
    }
    return 0;
}
[결과]

배열 확인
0102030405060708091011121314151617181920212223242526272829303132

2. 기본 출력

...

// 기본 출력
void buf_print() {
	// 8X4 
    for(int k = 0; k < SOURCE_HEIGHT; k++) {
        for (int i = 0; i < SOURCE_WIDTH; i++) {
            std::cout.width(2);
            std::cout.fill('0');
            // 4번(4행) 반복 => i
            // 한 행마다 인덱스가 4씩 증가 => i + SOURCE_WIDTH
            // 위 동작들을 8번(8행) 반복 => * k
            std::cout << SOURCE_BUF[i+SOURCE_WIDTH*k];
        }
        std::cout << '\n';
    }
}

int main()
{
    buf_fill();

    std::cout << "기본 출력" << '\n';
    buf_print();
    std::cout << '\n' << '\n';

    return 0;
}
[결과]

기본 출력
01020304
05060708
09101112
13141516
17181920
21222324
25262728
29303132

3. 왼쪽으로 90도 회전

...

// 왼쪽으로 회전
void buf_spin_left() {
	// 3. 아래 과정들을 4행 만큼 반복
    for(int j = 0; j < SOURCE_WIDTH; j++) {
    	// 2. 그래서 i를 4로 나눴을 때, 나머지가 3인 것들을 32개의 원소에서 추출 
        for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
            // 1. 위의 배열 이미지를 보면, 1행에 위치하는 인덱스가 모두 (4의 배수)+3
            if(i % SOURCE_WIDTH == SOURCE_WIDTH-1) {
                std::cout.width(2);
                std::cout.fill('0');
                std::cout << SOURCE_BUF[i-j];
            }
        }
        std::cout << '\n';
    }
}
int main()
{
    buf_fill();
    
    std::cout << "왼쪽으로 회전" << '\n';
    buf_spin_left();
    std::cout << '\n';
    
    return 0;
}
[결과]

왼쪽으로 회전
0408121620242832
0307111519232731
0206101418222630
0105091317212529

4. 오른쪽으로 90도 회전

...

// 오른쪽으로 회전
void buf_spin_right() {
	// 3. 아래 과정들을 4행 반복
    for(int j = 0; j < SOURCE_WIDTH; j++) {
        // 2. [31] ~ [0] 반복
        // SOURCE_HEIGHT - 1 == NULL-1
        for(int i = SOURCE_WIDTH*SOURCE_HEIGHT - 1 ; i >= 0; i--) {
        	// 1. 1행에 위치한 인덱스들이 모두 4의 배수
            if(i % SOURCE_WIDTH == 0) {
                std::cout.width(2);
                std::cout.fill('0');
                std::cout << SOURCE_BUF[i+j];
            }
        }
        std::cout << '\n';
    }
}

int main()
{
    buf_fill();

    std::cout << "오른쪽으로 회전" << '\n';
    buf_spin_right();
    std::cout << '\n';

    return 0;
}
[결과]

오른쪽으로 회전
2925211713090501
3026221814100602
3127231915110703
3228242016120804

5. 180도 회전

...

// 180도 뒤집기
void buf_spin_half() {
	// 2. 해당 동작을 [31] ~ [0] 까지 반복
    for(int i = SOURCE_WIDTH*SOURCE_HEIGHT-1; i >= 0; i--) {
        std::cout.width(2);
        std::cout.fill('0');
        std::cout << SOURCE_BUF[i];
		
        // 위의 배열을 보면, 4의 배수 다음 인덱스부터 다음 줄로 건너뜀
        // 1. 4의 배수 뒤는 다음 줄로 건너뛰도록 => '\n'
        if(i % SOURCE_WIDTH == 0) {
            std::cout << '\n';
        }
    }
}

int main()
{
    buf_fill();

    std::cout << "180도 뒤집기" << '\n';
    buf_spin_half();
    std::cout << '\n';

    return 0;
}
[결과]

180도 뒤집기
32313029
28272625
24232221
20191817
16151413
12111009
08070605
04030201

✅ 배열에 1 ~ 32 가 아닌 0과 1이 할당돼도 동작하는지 확인

다른 것들 수정 없이 buf_fill() 함수에서 #if 1을 #if 0으로 변경해주면 된다.

...

// 배열 값 할당
void buf_fill() {

#if 0

    // 배열에 값(1~32) 할당
    for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
        SOURCE_BUF[i] = i+1;
    }
// #if 0 일 경우 #else가 활성화
#else
    // 배열에 'ㄱ' 그림 데이터 삽입
    for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
        // 기본 출력 첫 행과 마지막 열 위치에 11 저장
        if(i < SOURCE_WIDTH || i % SOURCE_WIDTH == SOURCE_WIDTH-1) {
            SOURCE_BUF[i] = 11;
        }
        // 그 외 위치에 0 저장
        else {
            SOURCE_BUF[i] = 0;
        }
    }
#endif  // SOURCE_WIDTH
}
...
[결과]

기본 출력
11111111
00000011
00000011
00000011
00000011
00000011
00000011
00000011

왼쪽으로 회전
1111111111111111
1100000000000000
1100000000000000
1100000000000000

오른쪽으로 회전
0000000000000011
0000000000000011
0000000000000011
1111111111111111

180도 뒤집기
11000000
11000000
11000000
11000000
11000000
11000000
11000000
11111111

👩‍💻 최종 소스코드

#include <iostream>
#define SOURCE_WIDTH 4
#define SOURCE_HEIGHT 8

int SOURCE_BUF[SOURCE_WIDTH*SOURCE_HEIGHT];  // 전역변수

// 배열 값 할당
void buf_fill() {

#if 1
    // 배열에 값(1~32) 할당
    for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
        SOURCE_BUF[i] = i+1;
    }
// #if 0 일 경우 #else가 활성화
#else
    // 배열에 'ㄱ' 그림 데이터 삽입
    for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
        // 기본 출력 첫 행과 마지막 열 위치에 11 저장
        if(i < SOURCE_WIDTH || i % SOURCE_WIDTH == SOURCE_WIDTH-1) {
            SOURCE_BUF[i] = 11;
        }
        // 그 외 위치에 0 저장
        else {
            SOURCE_BUF[i] = 0;
        }
    }
#endif  // SOURCE_WIDTH
}

// 기본 출력
void buf_print() {

    for(int k = 0; k < SOURCE_HEIGHT; k++) {
        for (int i = 0; i < SOURCE_WIDTH; i++) {
            // 출력이 두 자리 미만 => 0으로 채움
            std::cout.width(2);
            std::cout.fill('0');
            std::cout << SOURCE_BUF[i+SOURCE_WIDTH*k];
        }
        std::cout << '\n';
    }
}

// 왼쪽으로 회전
void buf_spin_left() {

    for(int j = 0; j < SOURCE_WIDTH; j++) {
        for(int i = 0; i < SOURCE_WIDTH*SOURCE_HEIGHT; i++) {
            if(i % SOURCE_WIDTH == SOURCE_WIDTH-1) {
                std::cout.width(2);
                std::cout.fill('0');
                std::cout << SOURCE_BUF[i-j];
            }
        }
        std::cout << '\n';
    }
}

// 오른쪽으로 회전
void buf_spin_right() {

    for(int j = 0; j < SOURCE_WIDTH; j++) {
        // SOURCE_HEIGHT - 1 == NULL-1
        for(int i = SOURCE_WIDTH*SOURCE_HEIGHT - 1 ; i >= 0; i--) {
            if(i % SOURCE_WIDTH == 0) {
                std::cout.width(2);
                std::cout.fill('0');
                std::cout << SOURCE_BUF[i+j];
            }
        }
        std::cout << '\n';
    }
}

// 180도 뒤집기
void buf_spin_half() {

    // NULL-1 부터 0까지 감소하며, 값을 출력
    for(int i = SOURCE_WIDTH*SOURCE_HEIGHT-1; i >= 0; i--) {
        std::cout.width(2);
        std::cout.fill('0');
        std::cout << SOURCE_BUF[i];

        if(i % SOURCE_WIDTH == 0) {
            std::cout << '\n';
        }
    }
}

int main()
{
    buf_fill();

    std::cout << '\n' << '\n';

    std::cout << "기본 출력" << '\n';
    buf_print();
    std::cout << '\n';

    std::cout << "왼쪽으로 회전" << '\n';
    buf_spin_left();
    std::cout << '\n';

    std::cout << "오른쪽으로 회전" << '\n';
    buf_spin_right();
    std::cout << '\n';

    std::cout << "180도 뒤집기" << '\n';
    buf_spin_half();
    std::cout << '\n';

    return 0;
}
[결과]

기본 출력
01020304
05060708
09101112
13141516
17181920
21222324
25262728
29303132

왼쪽으로 회전
0408121620242832
0307111519232731
0206101418222630
0105091317212529

오른쪽으로 회전
2925211713090501
3026221814100602
3127231915110703
3228242016120804

180도 뒤집기
32313029
28272625
24232221
20191817
16151413
12111009
08070605
04030201
profile
👩‍💻 기록 및 복습을 위함

0개의 댓글