정보처리산업기사 실기/알고리즘

응용 알고리즘 - 배열

미웡할꺼야 2020. 11. 16. 20:34

행 우선/열 우선 배열 채우기

문제 : 2차원 배열 A(5, 5)의 원소에 다음 그림과 같은 모습으로 값을 저장해 주는 알고리즘을 제시하라.

1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25

 

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
public class 열우선배열채우기 {
 
    public static void main(String[] args) {
        int a[][] = new int[5][5];
        int v = 0// 증가값.
        int c = 0// 배열의 열.
        
        // 배열의 열 반복문.
        do {
            int r = 0// 배열의 행.
            // 배열의 행 반복분.
            do {
                v = v + 1;
                a[r][c] = v;
                r = r + 1;
            } while (r <= 4);
            c = c + 1;
        } while (c <= 4);
 
        for (int r = 0; r < 5; r++) {
            for (c = 0; c < 5; c++) {
                System.out.print(a[r][c] + "\t");
            }
            System.out.println();
        }
        /*
         * 1    6    11    16    21
         * 2    7    12    17    22
         * 3    8    13    18    23
         * 4    9    14    19    24
         * 5    10   15    20    25
         */
    }
}
cs

 


삼각형 모양으로 배열 채우기

문제 : 2차원 배열 A(5, 5)의 원소에 다음 그림과 같은 모습으로 값을 저장해 주는 알고리즘을 제시하라.

1 2 3 4 5
  6 7 8 9
    10 11 12
      13 14
        15

 

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
public class 삼각형모양으로배열채우기 {
 
    public static void main(String[] args) {
        int a[][] = new int[5][5];
        int v = 1// 증가값.
        int r = 0// 행 인덱스 변수.
        int c; // 열 인덱스 변수.
        
        // 배열의 행 반복문.
        do {
            /*
             * 행 값을 열 값에 대입하면
             * 행이 증가됨에 따라 열 값이 증가하여
             * 삼각형 모양의 배열로 채울 수 있다.
             */
            c = r;
            // 배열의 열 반복문.
            do {
                a[r][c] = v;
                v = v + 1;
                c = c + 1;
            } while (c <= 4);
            r = r + 1;
        } while (r <= 4);
 
        for (r = 0; r < 5; r++) {
            for (c = 0; c < 5; c++) {
                System.out.print(a[r][c] + "\t");
            }
            System.out.println();
        }
        /*
         * 1    2    3    4    5
         * 0    6    7    8    9
         * 0    0    10   11   12
         * 0    0    0    13   14
         * 0    0    0    0    15
         */
    }
}
cs

 


모래시계 모양으로 배열 채우기

문제 : 2차원 배열 A(5, 5)의 원소에 다음 그림과 같은 모습으로 값을 저장해 주는 알고리즘을 제시하라.

1 2 3 4 5
  6 7 8  
    9    
  10 11 12  
13 14 15 16 17

 

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
42
43
44
45
46
47
public class 모래시계모양으로배열채우기 {
 
    public static void main(String[] args) {
        int a[][] = new int[5][5];
        int v = 1// 증가값.
        int m = 3// 배열 중간 인덱스 값.
 
        // 배열 중간 인덱스까지 값을 채우는 배열의 행 반복문.
        for (int r = 0; r < m; r++) {
            /*
             * 배열의 행 인덱스가 증가됨에 따라
             * 배열의 시작 열 인덱스 1증가, 마지막 열 인덱스 1감소
             * 하는 배열의 열 반복문.
             */
            for (int c = r; c < (5 - r); c++) {
                a[r][c] = v;
                v = v + 1;
            }
        }
 
        // 배열 중간 인덱스 다음부터 값을 채우는 배열의 행 반복문.
        for (int r = m; r <= 4; r++) {
            /*
             * 배열의 행 인덱스가 증가됨에 따라
             * 배열의 시작 열 인덱스 1감소, 마지막 열 인덱스 1증가
             * 하는 배열의 열 반복문.
             */
            for (int c = (4 - r); c <= r; c++) {
                a[r][c] = v;
                v = v + 1;
            }
        }
 
        for (int r = 0; r < 5; r++) {
            for (int c = 0; c < 5; c++)
                System.out.print(a[r][c] + "\t");
            System.out.println();
        }
        /*
         * 1    2    3    4    5
         * 0    6    7    8    0
         * 0    0    9    0    0
         * 0    10   11   12   0
         * 13   14   15   16   17
         */
    }
}
cs

 


달팽이 모양으로 배열 채우기

문제 : 2차원 배열 A(5, 5)의 원소에 1부터 25까지의 번호를 다음 그림과 같은 모습으로 저장해주는 알고리즘을 제시하라.

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

 

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
42
43
44
45
46
public class 달팽이모양으로배열채우기 {
 
    public static void main(String[] args) {
        int a[][] = new int[5][5];
        int n = 0// 증가값.
        int s = 1// 행,열 증감용 변수.
        int i = 0// 배열의 행 인덱스.
        int j = -1// 배열의 열 인덱스.
        int k = 5// 수행 횟수 변수.
 
        // 달팽이 모양 배열 반복문.
        while (true) {
            // 달팽이 모양 배열의 행 반복문.
            for (int p = 0; p < k; p++) {
                n = n + 1;
                j = j + s;
                a[i][j] = n;
            }
 
            k = k - 1;
            if (k <= 0)
                break;
 
            // 달팽이 모양 배열의 열 반복문.
            for (int p = 0; p < k; p++) {
                n = n + 1;
                i = i + s;
                a[i][j] = n;
            }
            s = s * (-1);
        }
 
        for (i = 0; i < 5; i++) {
            for (j = 0; j < 5; j++)
                System.out.print(a[i][j] + "\t");
            System.out.println();
        }
        /*
         * 1     2     3     4    5
         * 16    17    18    19    6
         * 15    24    25    20    7
         * 14    23    22    21    8
         * 13    12    11    10    9
         */
    }
}
cs

 


마름모 모양으로 배열 채우기

문제 : 2차원 배열 A(5,5)의 원소에 다음 그림과 같은 모습으로 값을 저장해주는 알고리즘을 제시하라.

    1    
  3 5 7  
9 11 13 15 17
  19 21 23  
    25    

 

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
42
43
44
45
46
47
48
49
50
public class 마름모모양으로배열채우기 {
 
    public static void main(String[] args) {
        int a[][] = new int[5][5];
        int v = 1// 증가값.
        int m = 2// 배열 중간 인덱스.
        int cl = m; // 배열의 열 for문 초기값.
        int cr = m; // 배열의 열 for문 범위값.
        
        // 배열의 행 반복문.
        for (int r = 0; r <= 4; r++) {
            // 배열의 열 반복문.
            for (int c = cl; c <= cr; c++) {
                a[r][c] = v;
                v = v + 2;
            }
            
            /*
             * 배열 중간 인덱스 전까지
             * 반복문 열 초기값 1씩 감소
             * , 반복문 열 범위값 1씩 증가.
             */
            if (r < m) {
                cl = cl - 1;
                cr = cr + 1;
            /*
             * 배열 중간 인덱스부터
             * 반복문 열 초기값 1씩 증가
             * , 반복문 열 범위값 1씩 감소.
             */
            } else {
                cl = cl + 1;
                cr = cr - 1;
            }
        }
 
        for (int r = 0; r < 5; r++) {
            for (int c = 0; c < 5; c++)
                System.out.print(a[r][c] + "\t");
            System.out.println();
        }
        /*
         * 0    0    1    0    0
         * 0    3    5    7    0
         * 9    11    13    15    17
         * 0    19    21    23    0
         * 0    0    25    0    0
         */
    }
}
cs

 


'ㄹ'자 모양으로 배열 채우기

문제 : 2차원 배열 A(5,5)의 원소에 다음 그림과 같이 'ㄹ'자 모양으로 값을 저장해 주는 알고리즘을 제시하라.

1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25

 

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
42
public class ㄹ자모양으로배열채우기 {
 
    public static void main(String[] args) {
        int a[][] = new int[5][5];
        int v = 1// 증가값.
        int d = 1// 방향 전환(증감용) 변수.
        int c1 = 0// 배열의 열 for문 초기값.
        int c2 = 4// 배열의 열 for문 범위값.
 
        // 배열의 행 반복문.
        for (int r = 0; r < 5; r++) {
            // 배열의 열 반복문.
            for (int c = c1; c != c2 + d; c = c + d) {
                a[r][c] = v;
                v = v + 1;
            }
 
            /*
             * 한 행의 모든 열 값이 채워지면
             * 배열의 열 for문 초기값과 범위값을 스와핑한 후
             * 방향 전환 변수의 값도 "+ ,-" 스와핑 한다.
             */
            int temp = c1; // 임시 변수.
            c1 = c2;
            c2 = temp;
            d = -d;
        }
 
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++)
                System.out.print(a[i][j] + "\t");
            System.out.println();
        }
        /*
         * 1    2    3    4    5
         * 10    9    8    7    6
         * 11    12    13    14    15
         * 20    19    18    17    16
         * 21    22    23    24    25
         */
    }
}
cs

 


배열 회전시키기

문제 : 배열 A(5,5)를 시계 방향으로 90도 회전시켜 B(5,5)를 생성하는 알고리즘을 제시하라.

1 2 3 4 5 21 16 11 6 1
6 7 8 9 10 22 17 12 7 2
11 12 13 14 15 23 18 13 8 3
16 17 18 19 20 24 19 14 9 4
21 22 23 24 25 25 20 15 10 5

 

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class 배열회전시키기 {
 
    public static void main(String[] args) {
        // 원본 배열.
        int a[][] = { { 12345 }
                    , { 678910 }
                    , { 1112131415 }
                    , { 1617181920 }
                    , { 2122232425 } };
        int b[][] = new int[5][5]; // 90도 회전 배열.
        int n; // 배열 b의 열 번호 계산 변수.
        
        // 원본 배열 행 반복문.
        for (int r = 0; r <= 4; r++) {
            // 90도 회전 배열 행 반복문.
            for (int c = 0; c <= 4; c++) {
                /*
                 * 원본 배열 행 인덱스가 증가됨에 따라
                 * 90도 회전 배열 열 인덱스는 감소.
                 */
                n = 4 - r;
                /*
                 * 원본 배열의 값을 순차적으로 가져와
                 * 90도 회전 배열에 대입
                 */
                b[c][n] = a[r][c];
            }
        }
 
        System.out.println("원본 배열");
        for (int r = 0; r <= 4; r++) {
            for (int c = 0; c <= 4; c++)
                System.out.print(a[r][c] + "\t");
            System.out.println();
        }
        System.out.println("\n90도 회전 배열");
        for (int c = 0; c <= 4; c++) {
            for (n = 0; n <= 4; n++)
                System.out.print(b[c][n] + "\t");
            System.out.println();
        }
        /*
         * 원본 배열
         * 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
         * 
         * 90도 회전 배열
         * 21    16    11    6    1
         * 22    17    12    7    2
         * 23    18    13    8    3
         * 24    19    14    9    4
         * 25    20    15    10    5
         */
    }
}
cs