작성
·
685
0
#include <stdio.h>
void main()
{
int a[5][5]={0};
int i,j,cnt=0;
for(i=0; i<5; i++)
{
for(j=0; j<=i; j++)
{
cnt++;
a[j][i-j]=cnt;
}
}
for(i=1; i<5; i++)
{
for(j=i; j<5; j++)
{
cnt++;
a[j][i-j+5-1]=cnt;
}
}
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
if(a[i] [j]==0)
{
printf(" ");
}
else
{
printf("%3d",a[i] [j]);
}
}
printf("\n");
}
}
혹시 이 코드를 while문으로 쓰면 어떻게 쓰나요?
답변 1
0
제 풀이가 정답은 아닙니다.
01 02 04 07 11
03 05 08 12 16
06 09 13 17 20
10 14 18 21 23
15 19 22 24 25
해당 문자 배치에 패턴을 찾아 while()문으로 구현해봤습니다.
가로줄의 순열들의 패턴은
+1 +2 +3 +4
+2 +3 +4 +4
+3 +4 +4 +3
+4 +4 +3 +2
+4 +3 +2 +1
의 패턴으로 증감하게 됩니다.
해당 패턴을// 증감값이 최댓값이고 패턴이 양수 일 때 패턴의 값을 새로 주고 증감 하지 않음
if (increase >= row - 1 && pattern > 0) {
pattern = -1;
}
// 증감
else {
increase += pattern;
}
와 같은 형식으로 구현 했습니다.
가로줄의 증감은 일정하다고 봐도 다음 줄로 넘어갈 때 제일 처음의 숫자와 증감 숫자가 변합니다.
1번째 줄 --- 1
2번째 줄 --- 3
3번째 줄 --- 6
4번째 줄 --- 10
5번째 줄 --- 15
n 번째 줄의 숫자가 (n -1)번째 줄의 숫자 + n 인것을 알 수 있습니다.
ex) 2번째 줄 --- 1 + 2
해당 패턴을 // 다음 라인으로 넘어갈 때
if (cnt % row == 0) {
increase = (cnt / row) + 1; // n
num = line + increase; // (n-1)번째 줄의 첫번째 숫자 + n
line += increase; // n번째 줄의 첫번째 숫자
pattern = row - increase - 1;
printf("\n");
}
와 같은 형식으로 구현 했습니다.
pattern = row - increase - 1;
해당 구문은 마지막 줄은 시작할 때부터 감소하기 때문에 넣어줬습니다.
증감의 폭은 1~4 이기 때문에 넘어간 증감 값은 최댓값으로 맞춰줍니다.// 증감값이 오버 되면 최댓값으로 맞춤
if (increase > row - 1) {
increase = row - 1;
}
패턴의 값은 1 또는 -1 이어야 하기 때문에 양수와 음수인 경우로 나눠 값을 맞춰줍니다.// 패턴값이 0보다 크거나 같으면 1로 맞춤
if (pattern >= 0) {
pattern = 1;
}
통합 코드
#include <stdio.h>
int main() {
// 세로, 가로 값
int row = 5, col = 5;
// num : 현재 출력 값, increase : 증감 값, cnt : 반복 횟수
int num = 1, increase = 1, cnt = 0;
// line : 현재 세로 위치, pattern : 다음 증감값을 만들 값
int line = 1, pattern = 1;
while (cnt < row * col) {
cnt++;
// 증감값이 오버 되면 최댓값으로 맞춤
if (increase > row - 1) {
increase = row - 1;
}
// 패턴값이 0보다 크거나 같으면 1로 맞춤
if (pattern >= 0) {
pattern = 1;
}
printf("%3d", num);
num += increase;
// 증감값이 최댓값이고 패턴이 양수 일 때 패턴의 값을 새로 주고 증감 하지 않음
if (increase >= row - 1 && pattern > 0) {
pattern = -1;
}
// 증감
else {
increase += pattern;
}
// 다음 라인으로 넘어갈 때
if (cnt % row == 0) {
increase = (cnt / row) + 1;
num = line + increase;
line += increase;
pattern = row - increase - 1;
printf("\n");
}
}
return 0;
}