[자료구조] 달팽이 모양의 배열

dusruddl2·2023년 8월 18일
0

자료구조

목록 보기
21/23

문제

N과 M을 입력받고
NM(1<=N,M<=100)N*M(1<=N,M<=100) 크기의 행렬에
1 NM1~NM의 수를 나선형으로 채운 결과를 출력하라

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

풀이

1

예를 들어 454*5 행렬일 때 아래 그림과 같이 쌍을 묶는다.

묶은 쌍
index가 증가하거나 감소할 때의 가로축과 세로축으로
2개를 1쌍으로 잡았다.
(채우는 순서가 오른쪽or아래로 갈 때 증가,
왼쪽or위로 갈 때는 감소)

이렇게 잡으면 아래 그림과 같이
가로축은 5개->4개->3개->2개 순서로 채워야 하는 수가 감소하고
세로축은 3개->2개->1개로 감소하는 것을 알 수 있다.

for문을 통해 구현하겠다는 생각

2

그리고 첫 1쌍은 증가, 그 다음은 감소, 그 다음은 증가, 또 감소, ...
이러한 순서가 있는 것을 확인할 수 있고

이렇게 증가, 감소를 표현하기 위해
방향을 알려주는dir 변수를 사용하기로 했다.


profile
정리된 글은 https://dusruddl2.tistory.com/로 이동

0개의 댓글