가자공부하러!

알고리즘(6) - 배열응용 본문

공부/정보처리기사(실기)

알고리즘(6) - 배열응용

오피스엑소더스 2019. 4. 2. 15:48

목차

6-1. 배열(4)-다이아몬드 만들기

6-2. 배열(5)-모래시계 만들기

6-3. 배열(6)-오른쪽에 빈 삼각형 만들기

6-4. 배열(7)-이등변 삼각형 만들기

6-5. 배열(8)-90도 회전하기




6-1. 배열(4)-다이아몬드 만들기

> 5행 5열의 배열에 다음과 같이 기억시키는 코드를 작성.

 

 

 1

 

 

 

 

 

10 

11 

12 

 

 

 

13 

 



내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        int i=0,j=0,cnt=1,s=2,e=2;
        int[][] arr = new int[5][5];
        
        for(i=0;i<5;i++) {
            for(j=s;j<=e;j++)
                arr[i][j]=cnt++;    
            if(i>=2) {
                s++;
                e--;
            }else {
                s--;
                e++;
            }                
        }    
        
        for(i=0;i<5;i++) {
            for(j=0;j<5;j++)
                System.out.print(arr[i][j]+" ");
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

>  11번 줄 배열 인덱스 잘못입력( arr[i][e] -> arr[i][j])

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
 
int main() {
    int i, j;
    int a[5][5= { 0 };
    int k = 0;
    int s = 2, e = 2;
    for (i = 0; i <= 4; i++)
    {
        for (j = s; j <= e; j++)
        {
            k++;
            a[i][j] = k;
        }
        if (i >= 2)
        {
            s++;
            e--;
        }
        else
        {
            s--;
            e++;
        }
    }
    for (int x = 0; x <= 4; x++)
    {
        for (int y = 0; y <= 4; y++)
            printf("%3d", a[x][y]);
        printf("\n");
    }
}
cs

 

맨 위로


6-2. 배열(5)-모래시계 만들기

> 배열의 크기를 입력 받아 배열의 크기에 따라 아래와 같이 기억시키는 코드 작성.

> 단, 배열의 크기는 홀수로만 입력이 가능하다.

1

 

 

 

 

 

 

 

10 

11 

12 

 

13 

14 

15 

16 

17 


내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n= in.nextInt();        //홀수 정수 입력
        int i=0,j=0,cnt=1,s=0,e=n;    //초기화
        int[][] arr = new int[n][n];    //입력받은 정수 크기의 배열 선언
        
        for(i=0;i<n;i++) {        //배열 크기만큼 행 반복
            for(j=s;j<e;j++)    //
                arr[i][j]=cnt++;    
            if(i>=(n/2)) {        //중간지점 이후에는 시작값-1 종료값+1
                s--;
                e++;
            }else {                //중간지점 전에는 시작값+1 종료값-1
                s++;
                e--;
            }                
        }    
        
        for(i=0;i<n;i++) {
            for(j=0;j<n;j++)
                System.out.print(arr[i][j]+" ");
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

> 8번 줄 종료값e를 상수로 선언( e=7 -> e=n)

> 23, 24번 줄 반복조건을 잘못 설정 (j<5 -> j<n)


교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
 
int main() {
    int x, m, L, i, j, k;
    scanf("%d"&x);
    int a[x][x];
    for (i = 0; i < x; i++)
        for (j = 0; j < x; j++)
            a[i][j] = 0;
    k = 0;
    L = x;
    m = x / 2;
    for (i = 0; i <= m; i++)
    {
        L--;
        for (j = i; j <= L; j++)
        {
            k++;
            a[i][j] = k;
        }
    }
    for (i = m + 1; i <= x - 1; i++)
    {
        L--;
        for (j = L; j <= i; j++)
        {
            k++;
            a[i][j] = k;
        }
    }
    for (int y = 0; y < x; y++)
    {
        for (int z = 0; z < x; z++)
            printf("%3d", a[y][z]);
        printf("\n");
    }
}
cs


 

맨 위로


6-3. 배열(6)-오른쪽에 빈 삼각형 만들기

> 배열의 크기를 입력 받아 배열의 크기에 따라 아래와 같이 기억시키는 코드 작성.

> 단, 배열의 크기는 홀수로만 입력이 가능하다.

1

7

10 

11 

12 

13 

 

14 

15 

16 

17 

18 

 

 

19 

20 

21 

22 

 

 

 

23 

24 

25 

26 

27 

 

 

28 

29 

30 

31 

32 

33 

 

34 

35 

36 

37 

38 

39 

40 

내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n= in.nextInt();        //홀수 정수 입력
        int i=0,j=0,cnt=1,m=(n/2);    //초기화
        int[][] arr = new int[n][n];    //입력받은 정수 크기의 배열 선언
                
        for(i=0;i<=m;i++) {        //중간까지 행 반복
            for(j=0;j< (n-i);j++
                arr[i][j]=cnt++;
        }    
        for(i=m+1; i<n;i++) {    //중간부터 행 반복
            for(j=0;j<=i;j++)
                arr[i][j]=cnt++;
        }
        
        for(i=0;i<n;i++) {
            for(j=0;j<n;j++)
                System.out.print(arr[i][j]+" ");
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

>  

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
int main() {
    int x=7, m, k, i, j, L;
    int a[7][7];
    for (i = 0; i < x; i++)
        for (j = 0; j < x; j++)
            a[i][j] = 0;
    k = 0;
    m = x / 2;
    for (i = 0; i <= x - 1; i++)
    {
        if (i < m)
            L = x - i;
        else
            L = i + 1;
        for (j = 0; j <= L - 1; j++)
        {
            k++;
            a[i][j] = k;
        }
    }
 
    for (int y = 0; y < x; y++)
    {
        for (int z = 0; z < x; z++)
            printf("%3d", a[y][z]);
        printf("\n");
    }
}
cs



 

맨 위로


6-4. 배열(7)-이등변 삼각형 만들기

배열의 크기를 입력 받아 배열의 크기에 따라 아래와 같이 기억시키는 코드 작성.

 

 

 

 10

 

 

 5

 11

 

 2

 6

 12

 1

 3

 7

 13

 

 4

 8

 14

 

 

 9

 15

 

 

 

16


내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=4;
        int[][] arr = new int[(n*2)-1][n];    //입력받은 정수 크기의 배열 선언
        int e=n,s=n,i=0,j=0,cnt=1;
        for(i=0;i<n;i++) {
            for(j=s-1;j<=e-1;j++) {
                arr[j][i]=cnt++;
            }
            s--;        //시작 인덱스 -1
            e++;        //끝행 인덱스 +1
        }
        
        for(i=0;i<(n*2)-1;i++) {
            for(j=0;j<n;j++
                System.out.print(arr[i][j]);
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

>  

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
int main() {
    int col, row, k, j, L, e, i;
    scanf("%d"&col);
    row = col * 2 - 1;
    int a[7][4];
    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            a[i][j] = 0;
    k = 0;
    for (j = 0; j <= col - 1; j++)
    {
        L = col - (j + 1);
        e = (j - 1+ col;
        for (i = L; i <= e; i++)
        {
            k++;
            a[i][j] = k;
        }
    }
    for (int y = 0; y < row; y++)
    {
        for (int z = 0; z < col; z++)
            printf("%3d", a[y][z]);
        printf("\n");
    }
}
cs



 

맨 위로


6-5. 배열(8)-90도 회전하기

> 2차원 배열 90도 회전

>

1

 

 

 

 

 

 

 

10 

11 

12 

 

13 

14 

15 

16 

17 

 13

 

 

 

 1

 14

 10

 

 6

 2

 15

 11

 9

 7

 3

 16

 12

 

 8

 4

 17

 

 

 

5

내 코드(java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n= in.nextInt();        //홀수 정수 입력
        int i=0,j=0,cnt=1,s=0,e=n;    //초기화
        int[][] arr = new int[n][n];    //입력받은 정수 크기의 배열 선언
        
        for(i=0;i<n;i++) {        //배열 크기만큼 행 반복
            for(j=s;j<e;j++)    //
                arr[i][j]=cnt++;    
            if(i>=(n/2)) {        //중간지점 이후에는 시작값-1 종료값+1
                s--;
                e++;
            }else {                //중간지점 전에는 시작값+1 종료값-1
                s++;
                e--;
            }                
        }    
        
        int[][] arr2=new int[n][n];        //90도 회전한 배열을 저장할 배열 선언
        for(i=0;i<n;i++) {                //arr의배열크기 -1 -arr의 행 = arr2의 열 = n-1-i
            for(j=0;j<n;j++) {            //arr의 열 = arr2의 행  = j
                arr2[j][(n-1)-i] = arr[i][j];
            }
        }
        
        for(i=0;i<n;i++) {
            for(j=0;j<n;j++)
                System.out.print(arr[i][j]+" ");
            System.out.println("");
        }
        for(i=0;i<n;i++) {
            for(j=0;j<n;j++)
                System.out.print(arr2[i][j]+" ");
            System.out.println("");
        }
    }    
}
cs

*틀렸던 부분 : 

>  37번 줄 인덱스 순서를 잘못 입력 (arr2[j][i] -> arr2[i][j])

교재 코드(C)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
int main() {
    int i, j, k;
    int a[5][5= { 0 }, b[5][5= { 0 };
    k = 0;
    for (i = 4; i >= 0; i--)
    {
        for (j = i; j <= 4; j++)
        {
            k++;
            a[i][j] = k;
        }
    }
    for (i = 0; i <= 4; i++)
    {
        for (j = 0; j <= 4; j++)
            b[j][4 - i] = a[i][j];
    }
    for (int x = 0; x <= 4; x++)
    {
        for (int y = 0; y <= 4; y++)
            printf("%3d", a[x][y]);
        printf("\n");
    }
    printf("\n");
    for (int x = 0; x <= 4; x++)
    {
        for (int y = 0; y <= 4; y++)
            printf("%3d", b[x][y]);
        printf("\n");
    }
}
cs


 

맨 위로

Comments