정사각형의 한 변의 길이 n을 입력받은 후 다음과 같은 문자로 된 정사각형 형태로 출력하는 프로그램을 작성하시오.
< 처리조건 >
문자의 진행 순서는 왼쪽 위에서부터 아래쪽으로 ‘A'부터 차례대로 채워나가고 다시 오른쪽 아래부터 위쪽으로 채워나가는 방법으로 아래 표와 같이 채워 넣는다. 'Z' 다음에는 다시 'A'부터 반복된다.

정사각형 한 변의 길이 n(n의 범위는 1이상 100 이하의 정수)을 입력받는다.

위의 형식과 같이 한변의 길이가 n인 숫자 사각형을 출력한다.
숫자 사이는 공백으로 구분하여 출력한다.
[Copy]
4 |
[Copy]
A H I P
B G J O
C F K N
D E L M |
계속해서 비슷한 문제가 나오고 있는데요, 전부 마찬가지로 배열을 사용하시면 편하게 해결이 가능합니다.
사실 배열을 사용하지 않는 경우에는 메모리 상에서 이득을 보겠지만 그 반대급부로 속도가 떨어집니다.
그러므로 성능을 더 중시할 코드에서는 어느정도의 메모리 낭비를 감수하고 성능을 올릴 필요가 있겠죠.
그리고 무엇보다 보기 좋은 코드가 좋은 코드라고 할 수 있습니다.
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 |
#include <iostream>
using namespace std;
int main(void) {
int n; // 정사각형 한 변의 길이
int delta; // 문자의 변화 값
int c = 'A'; // 화면에 찍을 문자
cin >> n;
delta = (2 * n - 1) % 26;
for (int i = 0; i < n; i++) {
if (c + i > 'Z')
c = 'A' - i;
char temp = char(c + i);
for (int j = 0; j < n; j++) {
cout << temp << " ";
if (j % 2 == 0)
temp += delta - 2 * i % 26;
else
temp += 1 + 2 * i % 26;
if (temp > 'Z')
temp -= 26;
else if (temp < 'A')
temp += 26;
}
cout << endl;
}
}
|
cs |
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
51
52 |
#include <iostream>
using namespace std;
void Reset(char& c);
int main(void) {
int n; // 정사각형 한 변의 길이
char c = 'A'; // 화면에 찍을 문자
char arr[100][100]; // 결과를 저장할 배열
cin >> n;
for (int i = 0; i < n; ++i)
{
// 아래로 내려가며 처리
if (i % 2 == 0)
{
for (int j = 0; j < n; ++j)
{
arr[j][i] = c++;
Reset(c);
}
}
// 위로 올라가며 처리
else
{
for (int j = n - 1; j >= 0; --j)
{
arr[j][i] = c++;
Reset(c);
}
}
}
// 결과 출력
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cout << arr[i][j] << ' ';
}
cout << endl;
}
}
void Reset(char& c)
{
// c가 범위 넘어가면 초기화
if (c > 'Z')
c = 'A';
}
|
cs |
JUNGOL) 문제은행) 실력키우기) 문자사각형2