마름모의 한 변의 길이 N을 입력받아 아래와 같이 문자마름모를 출력하는 프로그램을 작성하시오.
< 처리조건 > (1) 첫 번째 행의 중앙부터 출발하여 시계 반대방향으로 'A'부터 차례대로 채워나간다. ('Z'다음에는 다시 'A'가 된다.) (2) 바깥 부분이 다 채워지면 두 번째 행 중앙부터 다시 같은 작업을 반복한다. (3) 같은 방법으로 마름모를 다 채워지도록 하여 출력한다.
마름모의 한변의 길이 N(N의 범위는 100 이하의 양의 정수)을 입력받는다.
주어진 형태대로 한변의 길이가 N인 문자마름모를 출력한다. 문자 사이는 한 개의 공백으로 구분한다.
주의 : 출력시 널문자('NULL', '\0')는 출력되지 않게 하세요..
[Copy] 4
[Copy] A
B M L
C N U T K
D O V Y X S J
E P W R I
F Q H
G
지금껏 정사각형이 나오다가 갑자기 마름모가 출현해서 굉장히 당황하게 되었던 문제였는데요,
이 문제는 약간 시선을 바꿔서 생각하면 조금 더 쉽게 해결이 가능합니다.
단순하게 생각하면 배열을 크게 만들어서 대각선을 따라 이동하도록 하면 됩니다.
즉, 위의 문제에서 보면 n이 4이면 7*7배열을 만들어서 사용하는 것이죠.
코드 접기
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include < iostream>
using namespace std ;
int main(void ) {
char arr[200 ][200 ]; // 결과 저장용 배열
char c = 'A' ; // 문자 출력용
int n, counter = 0 ; // 마름모 한 변의 길이n , 회전횟수
int lb, rb, rt, lt; // 각 대각선을 처리하는 횟수 제한용
while (1 )
{
cin > > n;
if (n < = 0 & & n> 100 )
continue ;
break ;
}
// 마름모의 빈 구역을 나타내기위해 빈 문자로 초기화
for (int i = 0 ; i < 200 ; i+ + )
for (int j = 0 ; j < 200 ; j+ + )
arr[i][j] = ' ' ;
lb = rb = 0 ; rt = lt = 1 ;
while (counter < n) {
counter+ + ;
// 좌하단 대각선 처리
for (int i = lb; i < n; i+ + ) {
arr[i][n - 1 - i + lb] = c+ + ;
if ('Z' < c)
c = 'A' ;
}
lb+ + ;
// 우하단 대각선 처리
for (int i = n; i < = 2 * (n - 1 ) - rb; i+ + ) {
arr[i][i - n + 1 + rb] = c+ + ;
if ('Z' < c)
c = 'A' ;
}
rb+ + ;
// 우상단 대각선 처리
int k = n;
for (int i = 2 * (n - 1 ) - rt; i > = n - 1 ; i- - ) {
arr[i][k+ + ] = c+ + ;
if ('Z' < c)
c = 'A' ;
}
rt+ + ;
// 좌상단 대각선 처리
k = 2 * (n - 1 ) - lt;
for (int i = n - 2 ; i > = lt; i- - ) {
arr[i][k- - ] = c+ + ;
if ('Z' < c)
c = 'A' ;
}
lt+ + ;
}
// 결과 출력
for (int i = 0 ; i < = 2 * (n - 1 ); i+ + ) {
for (int j = 0 ; j < = 2 * (n - 1 ); j+ + ) {
cout < < arr[i][j] < < " " ;
}
cout < < endl;
}
}
cs
접기
JUNGOL) 문제은행) 실력키우기) 문자마름모