N과 M을 입력받고
크기의 행렬에
의 수를 나선형으로 채운 결과를 출력하라
ex) 각각 4x4, 4x5일때
#include <stdio.h>
#include <stdlib.h>
int main() {
int i = 0, j = 0, k, N, M;
scanf("%d %d", &N, &M);
int X[100][100] = { 0 };
// 배열 채우기
int dir = 1, num = 1;
int NN = N, MM = M;
while (num <= N*M) { // 1~MN 수까지 반복문
// 행 고정, 열 기준으로 채우는 과정
// k는 반복 횟수만을 세기 위한 변수
for (k = 0; k < MM; k++) {
X[i][j] = num++;
j += dir;
}
j -= dir; i += dir;
// 열 고정, 행 기준으로 채우는 과정
// k는 반복 횟수만을 세기 위한 변수
for (k = 0; k < NN - 1; k++) {
X[i][j] = num++;
i += dir;
}
i -= dir; j -= dir;
NN--; MM--;
dir *= -1; // 방향 바꾸기
}
// 결과 출력
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
printf(" %d", X[i][j]);
}
printf("\n");
}
return 0;
}
예를 들어 행렬일 때 아래 그림과 같이 쌍을 묶는다.
묶은 쌍은
index가 증가하거나 감소할 때의 가로축과 세로축으로
2개를 1쌍으로 잡았다.
(채우는 순서가 오른쪽or아래로 갈 때 증가,
왼쪽or위로 갈 때는 감소)
이렇게 잡으면 아래 그림과 같이
가로축은 5개->4개->3개->2개 순서로 채워야 하는 수가 감소하고
세로축은 3개->2개->1개로 감소하는 것을 알 수 있다.
for문
을 통해 구현하겠다는 생각
그리고 첫 1쌍은 증가, 그 다음은 감소, 그 다음은 증가, 또 감소, ...
이러한 순서가 있는 것을 확인할 수 있고
이렇게 증가, 감소를 표현하기 위해
방향을 알려주는dir
변수를 사용하기로 했다.