inflearn logo
강의

Khóa học

Chia sẻ kiến thức

2차원배열(대각선)

713

ykim9901104847

3 câu hỏi đã được viết

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문으로 쓰면 어떻게 쓰나요?

Câu trả lời 1

0

oortcloud983612

제 풀이가 정답은 아닙니다.

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;
}

 

백준 서비스 종료

9

658

1

[업데이트] 파이썬 패키지 부분에서 안되어서 강의 진행 불가

2

53

3

이력서 구성에 대한 질문드립니다.

1

77

2

itertools, sys같은 STL을 사용할 수 없는 경우 질문드립니다.(백준 11724)

1

27

1