참고 사이트
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
...
// 기본 출력
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
...
// 왼쪽으로 회전
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
...
// 오른쪽으로 회전
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
...
// 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
다른 것들 수정 없이 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