728x90

문제1)가로의 길이가 9, 세로의 길이가 3인 int형 2차원 배열을 선언하여 구구단 중 2단,3단, 4단을 다음과 같이 저장하자.

  1열 2열 3열 4열 5열 6열 7열 8열 9열
1행 2 4 6 8 10 12 14 16 18
2행 3 6 9 12 15 18 21 24 27
3행 4 8 12 16 20 24 28 32 36

그리고 제대로 저장이 되었는지 확인하기 위한 출력을 진행하는 예제를 작성해보자

#include <stdio.h>
int main(void){
    int arr[3][9]={{2,4,6,8,10,12,14,16,18},
                   {3,6,9,12,15,18,21,24,27},
                   {4,8,12,16,20,24,28,32,36}
                   };
    for(int i=0;i<3;i++){
        for(int j=0;j<9;j++){
            printf("%d ", arr[i][j] );
        }
        printf("\n");
    }

}

2차원 배열의 형태를 기억하는게 중요할 것 같다. 앞은 줄 갯수 뒤에가 안에 있는 숫자의 개수라는것을....

이것을 처음에 헷갈려서 반대로 쓰고 있었다. 그대ㅗㄹ 입력하는 것이라서 크게 어렵지 않는 것 같다.

 

 


문제2) 아래그림과 관련하여 문제를 제시할테니 그림에서 제시하는 배열 A와 배열 B를 유심히 관찰하자

1 2 3 4
5 6 7 8
1 5
2 6
3 7
4 8

 

위에 것이 배열A이고 아래것이 배열 B

#include <stdio.h>
int main(void){
    int arr1[2][4]={{1,2,3,4},
                    {5,6,7,8}
                    };
    int arr2[4][2];
    for(int i=0;i<4;i++){
        for(int j=0;j<2;j++){
            arr2[i][j]=arr1[j][i];
        }
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<2;j++){
            printf("%d ", arr2[i][j]);
        }
        printf("\n");
    }
}

이것도 배열을 안다면 크게 어렵지 않다. 배열A는 배열 입력해주면 되고 B만 초기화 단계에서 해결하기 어렵다. 배열A를 이용해서 하라고 했다. 그래서 for문으로 각각의 과정을 넣어주었고 이 표들을 보니 서로 반대로 숫자가 되어있다는 것을 발견하였다. i,j라면 j,i형태로 되어있었다. 그래서 arr2에서 i,j배열일떼 arr1은 j,i배열이라고 선언해주었다.

출력과정은 arr2 입력넣을 때랑 같고, 똑같이 만들기 위해 줄바꾸는 것을 잊지 않는 것이 좋을 것 같다.

 

 


문제3) 성적 관리 프로그램을 작성하자. 과목은 국어, 영어, 수학, 국사 이렇게 네과목이고 학생은 철희, 철후,영희, 영수 이렇게 네사람이다. 프로그램 사용자로부터 이 네사람의 네과목 점수를 입력 받는 다 .그리고 미리 선언해 놓은 배열에 다음의 형태로 그 값을 저장해야 한다. 저장이 끝났다면, 개인별 총점과 과목별 총점을 계산해서 다음그림에서 보이는 배열의 위치에 저장해야 한다. 그리고 마지막에는 저장된 값의 검증을 위한 출력을 보여야한다.

  국어 영어 수학 국사 총점
철희 5 4 6 5 20
철수 3 9 6 3 21
영희 4 8 2 7 21
영수 3 8 9 7 27
과목별 총점 15 26 26 22 89
#include <stdio.h>
int main(void){
    int arr[5][5]={0};
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            scanf("%d", &arr[i][j]);
        }
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            arr[i][4]+=arr[i][j];
            
        }//세로
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            arr[4][j]+=arr[i][j];
        }
    }//가로
    for(int i=0;i<4;i++){
        printf("%d\n", arr[4][4]);
        arr[4][4]+=arr[i][4];
    }//이건 마지막자리
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }

}

이 문제는 그렇게 어렵지 않은데 최종 부분이 안풀려서 한참을 헤멨던 문제였다. 그 이유를 반복해서 알아본 결과 초기화의 문제라고 보았고 시작에서 선언 시 0으로 초기화를 하고 값을 넣어주었다. 그리고 선언해준 것보다 하나 적게 해서 마지막 칸에 넣어주어야 한다. for문 마지막 것을 안에 넣을 수도 있을 것 같은데 일단 바깥으로 뺐다. 빼서 그 자리를 마지막 칸에 숫자를 넣을 수 있도록 만들었다. 가로 세로는 똑같은 원리이므로 문제는 없다.

여기서 얻은 교훈은 초기화를 잘하자!!

728x90

'C language > 열혈C 문제풀이' 카테고리의 다른 글

[C] 열혈C 문제풀이 24  (0) 2021.08.12
[C] 열혈C 문제풀이 17-1  (0) 2021.08.12
[C] 열혈C 문제풀이 14-1  (0) 2021.08.12
[C] 열혈C 문제풀이 13-1 1번,3번  (0) 2021.08.12
[C]열혈C 문제풀이 12-1 2번  (0) 2021.08.12

+ Recent posts