가자공부하러!

알고리즘(7) - 배열응용2, 실무응용 본문

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

알고리즘(7) - 배열응용2, 실무응용

오피스엑소더스 2019. 4. 2. 20:36

목차

7-1. 배열(9)-달팽이 만들기

7-2. 배열(10)-대각선으로 채우기

7-3. 배열(11)-마방진(Magic Square)

7-4. 배열(12)-행렬 변환

7-5. 실무응용(1)-화폐의 종류 별 매수 계산



7-1. 배열(9)-달팽이 만들기

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

1

 16

 17

 18

 19

 6

 15

 24

 25

 20

 14

 23

 22

 21

 8

 13

 12

 11

 10

 9


내 코드(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
package Test.java;
 
public class TestMain {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=0,i=0,j=-1,k=0,f=5,c=1;    //변수 선언
        int arr[][]=new int[5][5];        //5*5 배열 선언
        
        do {
            for(n=0; n<f; n++) {
                k++;                    //배열에 직접 저장될 값 k
                j+=c;                    //열 지정 변수
                arr[i][j]=k;
            }
            f--;
            if(f<0)
                break;
            for(n=0; n<f; n++) {
                k++;
                i+=c;                    //행 지정 변수
                arr[i][j]=k;
            }
            c*=-1;                        //행-열 순행 역행 결정
        }while(f>-2);
        
        for(int ii=0; ii<5; ii++) {
            for(int jj=0;jj<5;jj++)
                System.out.print(arr[ii][jj]+" ");
            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
31
32
33
34
35
36
#include <stdio.h>
 
int main() {
    int k, c, i, j, f, n;
    int a[5][5= { 0 };
    k = 0;
    c = 1;
    i = 0;
    j = -1;
    f = 5;
    while (1)
    {
        for (n = 1; n <= f; n++)
        {
            k++;
            j += c;
            a[i][j] = k;
        }
        f--;
        if (f <= 0)
            break;
        for (n = 1; n <= f; n++)
        {
            k++;
            i += c;
            a[i][j] = k;
        }
        c *= -1;
    }
    for (int x = 0; x <= 4; x++)
    {
        for (int y = 0; y <= 4; y++)
            printf("%3d", a[x][y]);
        printf("\n");
    }
}
cs


맨 위로



7-2. 배열(10)-대각선으로 채우기

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

>

1

 2

 4

 7

 11

 3

 5

 8

 12

 16

 6

 9

 13

 17

 20

 10

 14

 18

 21

 23

 15

 19

 22

 24

 25

내 코드(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 java_test;
 
public class test {
 
    public static void main(String[] args) {
        int i=0,j=0,k=0;
        int a[][] = new int[5][5];
        int l=0;                    //배열에 저장될 정수
        
        for(i=0; i<9; i++) {        //행과 열의 합 이용
            for(j=0; j<5; j++) {    //00->[01->10]->[02->11->20]...
                k=i-j;                //열 위치 지정 변수
                if(k<0)                
                    continue;
                if(k>4)
                    continue;
                a[j][k]=++l;        //j행 k열에 저장
            }
        }        
        for(i=0; i<5;i++) {
            for(j=0;j<5;j++)
                System.out.print(a[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
#include <stdio.h>
 
main()
{
    int i, j, k;
    int a[5][5= { 0 };
    int L = 0;
    for (i = 0; i <= 8; i++)
    {
        for (j = 0; j <= 4; j++)
        {
            k = i - j;
            if (k < 0continue;
            if (k > 4continue;
            L++;
            a[j][k] = L;
        }
    }
    for (int x = 0; x <= 4; x++)
    {
        for (int y = 0; y <= 4; y++)
            printf("%3d", a[x][y]);
        printf("\n");
    }
}
cs


맨 위로



7-3. 배열(11)-마방진(Magic Square)

> 5행 5열 배열에 가로와 세로의 합이 모두 같은 마방진을 저장하는 코드 작성

>

 17

 24

 1

 8

 15

 23

 5

 7

 14

 16

 4

 6

 13

 20

 22

 10

 12

 19

 21

 3

 11

 18

 25

 2

9


내 코드(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
package java_test;
 
public class test {
 
    public static void main(String[] args) {
        int i=0,j=2,k=0;
        int a[][] = new int[5][5];    //5*5배열 선언
        int l=0;                    //배열에 저장될 정수
        
        while(l<(5*5)) {            //반복횟수 25회
            a[i][j]=++l;            //arr[0][2]부터 시작
            if(l%5 == 0) {
                i++;                //l이 5의 배수이면 행+1
            }else {
                i--;                //l이 5의 배수가 아니면 i-- j++
                j++;
                if(i<0)                //행이 0보다 작으면 행값을 4로 설정
                    i=4;
                if(j>4)                //열이 4보다 크면 열값을 0으로 설정
                    j=0;
            }
        }
        for(i=0; i<5;i++) {
            for(j=0;j<5;j++)
                System.out.print(a[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
31
#include <stdio.h>
 
main()
{
    int i, j, k, nmg;
    int a[5][5= { 0 };
    i = 0;
    j = 5 / 2;
    for (k = 1; k <= 25; k++)
    {
        a[i][j] = k;
        nmg = k - k / 5 * 5;
        if (nmg == 0)
        {
            i++;
            continue;
        }
        i--;
        j++;
        if (i < 0)
            i = 4;
        if (j > 4)
            j = 0;
    }
    for (int x = 0; x <= 4; x++)
    {
        for (int y = 0; y <= 4; y++)
            printf("%3d", a[x][y]);
        printf("\n");
    }
}
cs

맨 위로



7-4. 배열(12)-행렬 변환

> 5행 3열 배열의 행과 열을 바꾸어 3행 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 java_test;
 
public class test {
 
    public static void main(String[] args) {
        int i=0,j=0,k=0,l=0;
        int row=5, clm=3;            //행과 열 변수 선언
        int m=0;                    //배열에 저장될 숫자
        int a[][] = new int[row][clm];    //5행 3열 배열 선언
        int b[][]= new int[clm][row];    //3행 5열 배열 선언
        
        for(i=0;i<row;i++)            //a배열 초기화
            for(j=0;j<clm;j++)
                a[i][j]=++m;
        
        for(i=0; i<row;i++) {        //a배열의 행만큼 반복
            for(j=0;j<clm;j++) {        //a배열의 열만큼 반복        
                b[k][l]=a[i][j];
                l++;
                if(l >= row) {
                    l=0;
                    k++;
                }
            }
            System.out.println();
        }
        
        for(i=0;i<row;i++) {        //a행렬 출력
            for(j=0;j<clm;j++)
                System.out.print(a[i][j]);
            System.out.println();
        }
        
        for(i=0;i<clm;i++) {        //b행렬 출력
            for(j=0;j<row;j++)
                System.out.print(b[i][j]);
            System.out.println();
        }
    }
}
 
cs

*틀렸던 부분 : 

> 20번 줄 b배열에 행 변수 조정 k++를 l++위에 두어서 b배열에 올바른 값이 들어가지 않음 -> k++을 23번줄로 이동

교재 코드(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
39
40
#include <stdio.h>
 
main()
{
    int row, col, i, j, L, m;
    scanf("%d %d"&row, &col);
    int a[row][col];
    int b[col][row];
    int k = 0;
    for (i = 0; i <= row - 1; i++)
    {
        for (j = 0; j <= col - 1; j++)
        {
            k++;
            a[i][j] = k;
        }
    }
    L = 0;
    m = -1;
    for (i = 0; i <= row - 1; i++)
    {
        for (j = 0; j <= col - 1; j++)
        {
            m += 1;
            b[L][m] = a[i][j];
            if (m >= row - 1)
            {
                L++;
                m = -1;
            }
        }
    }
    for (int x = 0; x < col; x++)
    {
        for (int y = 0; y < row; y++)
            printf("%3d", b[x][y]);
        printf("\n");
    }
}
 
cs


맨 위로



7-5. 실무응용(1)-화폐의 종류 별 매수 계산

> 다음 입력 형식과 같이 입력 받은 후 화폐 단위별로 화폐의 매수를 계산하여 출력 형식에 맞게 출력하는 코드 작성.

> 입력 형식 : 이름, 출장비 지급액(이름으로 QUIT가 입력되면 프로그램 종료)

> 출력 형식 : 성명, 출장비 지급액, 오만, 일만, 오천, 일천, 오백, 일백, 오십, 일십, 오, 일


내 코드(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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package Test.java;
import java.util.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);//스캐너 객체 선언
        Person p1 = new Person();
        p1.inputData();
        p1.printAllEmployeeData();
 
        
    }    
}
 
class Person{
    Scanner in = new Scanner(System.in);//객체 내 스캐너 객체 선언
    
    private int i=0,j=0,k=0,l=0;
    private int[] billsAmount = new int[10];    //출장비 단위 별 매수 총 합 저장 배열
    private String man[][] = new String[5][2];    //성명과 출장비 저장 배열   
    void initializePerson() {                    //객체 내 배열값 초기화
        for(String[] ii:man)
            Arrays.fill(ii,"0");
    }
    void inputData() {                    //데이터를 입력받기 위한 메소드
        initializePerson();
        for(i=0;i<5;i++) {
            System.out.print("성함(QUIT입력시 입력 종료) : ");
            man[i][j]=in.next();
            if(man[i][j].contentEquals("QUIT")) {
                System.out.println("입력 종료");
                man[i][j]="0";
                break;
            }
            j++;
            System.out.print("출장비(콤마를 제외한 정수입력) : ");
            man[i][j]=in.next();
            j=0;
        }
    }
    void printAllEmployeeData() {        //직원 정보 출력
        Arrays.fill(billsAmount, 0);    //단위 별 매수 초기화
        System.out.println("직원 정보를 출력합니다.");
        System.out.println("[성함] [출장비] 5만 1만 5천 1천 5백 1백 5십 1십 5 1");
        for(i=0;i<5;i++) {
            for(j=0;j<2;j++
                System.out.print(man[i][j]+" ");    
            printPersonalBills(Integer.parseInt(man[i][1]));    //단위 별 매수 계산            
            System.out.println("");
        }
        System.out.print("단위 별 매수 :     ");
        for(k=0;k<10;k++)
            System.out.print(billsAmount[k]+"   ");
    }
    void printPersonalBills(int aa) {    //개인 별 화폐 매수 출력 메소드
        int amount=aa;
        int billScale=50000;
        int qtt=0,chc=1;
        for(int ii=0;ii<10;ii++) {
            qtt=(amount/billScale);
            billsAmount[ii]+=qtt;
            System.out.print(qtt+"  ");
            amount-=(qtt*billScale);
            if(chc==1) {
                billScale/=5;
                chc=0;                
            }else {
                billScale/=2;
                chc=1;
            }
        }
    }
}
cs

*틀렸던 부분 : 

> 31번 줄 equals를 ==로 잘못 작성

교재 코드(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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#define _CRT_SECURE_NO_WARNINGS
#define LENGTH 10 
#include <stdio.h>
#include <string.h>
 
struct member
{
    char n[10];
    int p, pm[10];
};
 
main()
{
    FILE *inf;
    inf = fopen("data1.txt""r");
    struct member data;
    int tm[10], k, t, m, sw;
    printf(" \t \t \t \t출장비 지급표\n");
    printf("성명 출장비지급액 오만 일만 오천 일천 오백 일백 오십 일십  오   일\n");
    for (k = 0; k <= LENGTH - 1; k++)
        tm[k] = data.pm[k] = 0;
    fscanf(inf, "%s %d", data.n, &data.p);
    do
    {
        t = data.p;
        m = 50000;
        sw = 1;
        for (k = 0; k <= LENGTH - 1; k++)
        {
            data.pm[k] = t / m;
            t -= data.pm[k] * m;
            if (sw == 1)
            {
                m /= 5;
                sw = 0;
            }
            else
            {
                m /= 2;
                sw = 1;
            }
        }
        printf("%s  %d  ", data.n, data.p);
        for (k = 0; k <= LENGTH - 1; k++)
        {
            printf("%5d", data.pm[k]);
            tm[k] += data.pm[k];
        }
        printf("\n");
        fscanf(inf, "%s %d", data.n, &data.p);
    } while (strcmp(data.n, "quit"!= 0);
    printf("전체 화폐 매수  ");
    for (k = 0; k <= LENGTH - 1; k++)
        printf("%5d", tm[k]);
    fclose(inf);
}
cs


맨 위로





Comments