기타

2차원 배열 이동 문제

swchung09 2025. 4. 8. 18:34

2차원 배열로 15x15 짜리 판을 하나 만들고, 0으로 전부 초기화 한 후, 정 가운데 부분만 1로 둡니다.(체스에서 말을 둔다고 생각)
그리고 숫자를 0이 입력될 때 까지 입력받고, 
1을 입력할시 오른쪽으로, 2를 입력할시 아래로, 3을 입력할 시 왼쪽으로, 4를 입력할 시 위쪽으로 한칸씩 이동하고, 이동 할 때마다 이동한 판을 출력하는 코드를 작성하세요. (범위 밖으로 나가는건 처리하지 않아도 됩니다)

조건) 이동하는 코드, 출력하는 코드는 모두 함수로 작성합니다.


이 문제에서는 전역 변수로 array를 선언하면 편하기 때문에, {{0, }, {0, } (생략)}형식으로 초기화 했다.

int arr[15][15] = {{0,}, {0,}, {0,}, {0,}, {0,},
    {0,}, {0,}, {0,}, {0,}, {0,},
    {0,}, {0,}, {0,}, {0,}, {0,}};

이 배열은 다음과 같다. (전부 값은 0이다)

(0, 0) (1, 0) (2, 0) (3, 0) (4, 0) (5, 0) (6, 0) (7, 0) (8, 0) (9, 0) (10, 0) (11, 0) (12, 0) (13, 0) (14, 0)

(0, 1)  (1, 1) (2, 1)  (3, 1)  (4, 1) (5, 1)  (6, 1) (7, 1)  (8, 1)  (9, 1) (10, 1)  (11, 1) (12, 1) (13, 1) (14, 1)

(0, 2) (1, 2) (2, 2) (3, 2) (4, 2) (5, 2) (6, 2) (7, 2) (8, 2) (9, 2) (10, 2) (11, 2) (12, 2) (13, 2) (14, 2) ...

우선 이동 하기 전, 현재 1이 있는 부분을 찾아야 하기 때문에 find함수부터 만들었다. (이 때 함수는 크기가 2인 정수 배열을 리턴하기 위해 포인터를 사용한다.)

int* find(void){
    static int pos[2];
    for (int x = 0; x < 15; x++){
        for (int y = 0; y < 15; y++){
            if (arr[y][x] == 1){
                pos[0] = x;
                pos[1] = y;
                return pos;
            }
        }
    }
    return pos;
}

그 다음 left함수를 x-1로 구현했다.

void left(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y][x-1] = 1;
}

그 다음 right함수를 x+1로 구현했다.

void right(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y][x+1] = 1;
}

그 다음 up함수를 y-1(위에서 설명 한 것 처럼 y가 작을 수록 위를 의미하기 때문이다.)로 구현했다.

void up(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y-1][x] = 1;
}

그 다음 down함수를 y+1로 구현했다.

void down(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y+1][x] = 1;
}

그리고 모든 이동 후, 출력하는 함수 print_arr를 만들었다.

void print_arr(void){
    for (int x = 0; x < 15; x++){
        for (int y = 0; y < 15; y++){
            printf("%d ", arr[x][y]);
        }
        printf("\n");
    }
}

그 후 각 번호마다 이동함수가 실행되는 switch-case와, 배열 가운데에 1을 추가하는 코드등이 포함된 main함수를 만들었다.

int main(void){
    arr[7][7] = 1;
    int num = -1;
    while (num != 0){
        scanf("%d", &num);
        switch (num) {
            case 0:
                return 0;
            case 1:
                right();
                break;
            case 2:
                down();
                break;
            case 3:
                left();
                break;
            case 4:
                up();
        }
        print_arr();
    }
}

최종 코드

#include <stdio.h>
int arr[15][15] = {{0,}, {0,}, {0,}, {0,}, {0,},
    {0,}, {0,}, {0,}, {0,}, {0,},
    {0,}, {0,}, {0,}, {0,}, {0,}};

int* find(void){
    static int pos[2];
    for (int x = 0; x < 15; x++){
        for (int y = 0; y < 15; y++){
            if (arr[y][x] == 1){
                pos[0] = x;
                pos[1] = y;
                return pos;
            }
        }
    }
    return pos;
}
void left(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y][x-1] = 1;
}
void right(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y][x+1] = 1;
}
void up(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y-1][x] = 1;
}
void down(void){
    int x = find()[0], y = find()[1];
    arr[y][x] = 0;
    arr[y+1][x] = 1;
}
void print_arr(void){
    for (int x = 0; x < 15; x++){
        for (int y = 0; y < 15; y++){
            printf("%d ", arr[x][y]);
        }
        printf("\n");
    }
}
int main(void){
    arr[7][7] = 1;
    int num = -1;
    while (num != 0){
        print_arr();
        scanf("%d", &num);
        switch (num) {
            case 0:
                return 0;
            case 1:
                right();
                break;
            case 2:
                down();
                break;
            case 3:
                left();
                break;
            case 4:
                up();
        }
    }
}

'기타' 카테고리의 다른 글

별찍기 with 숫자  (0) 2025.05.26
별찍기  (0) 2025.05.26
우분투, SSH  (0) 2025.05.14
Git, Github  (3) 2025.05.07
구조체가 담긴 배열의 포인터  (0) 2025.04.15