가자공부하러!

알고리즘(8) - 실무응용2 본문

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

알고리즘(8) - 실무응용2

오피스엑소더스 2019. 4. 3. 19:42

목차

8-1. 실무응용(2)-부서별 합계

8-2. 실무응용(3)-동별, 나이별 인원 통계

8-3. 실무응용(4)-학급별 최대, 최소 체중

8-4. 실무응용(5)사과 구입

8-5. 실무응용(6)사과 나눠 갖기



8-1. 실무응용(2)-부서별 합계

> 다음 자료를 입력받은 후 출력 형식에 맞게 출력하는 코드를 작성.

> 자료 :

영업

강현준

1000

100

영업

조충희

1300

140

총무

이다인

1200

150

총무

강호정

1500

230

> 출력 형식 : 

사원 급여표

부서

성명

본봉

수당

합계

영업

xxx

xxx

xxx

xxx

영업

xxx

xxx

xxx

xxx

부서합계 : 

xxx

   

총무

xxx

xxx

xxx

xxx

총무

xxx

xxx

xxx

xxx

부서합계 : 

xxx

     

전체합계 : 

xxx

   

내 코드(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
package Test.java;
import java.util.*;
import java.io.*;
import java.lang.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        member mb = new member();
                
        int prvSlr=0,dptSlr=0,ovrSlr=0;        //합계 저장 변수 선언
        String dptChc=" ";            //부서 체크 변수 선언
        
        try{
            Scanner inf=new Scanner(new FileReader("D:\\java_data1.txt"));    //데이터 파일 불러오기
            FileWriter ouf = new FileWriter("D:\\java_result.txt");            //결과파일 저장
            
            ouf.write(String.format("\t\t\t사원 급여표\r\n"));            //결과파일 헤더 출력
            ouf.write(String.format("부서\t성명\t본봉\t수당\t합계\r\n"));
            
            mb.dpt=inf.next();
            mb.name=inf.next();
            mb.slr=Integer.parseInt(inf.next());
            mb.addSlr=Integer.parseInt(inf.next());
            while(inf.hasNext()) {
                    dptChc=mb.dpt;        //부서 체크 변수 수정
                    dptSlr=0;            //부서 급여 합계 초기화
                    
                    do {
                        prvSlr=mb.slr+mb.addSlr;    //개인 급여 합계
                        dptSlr+=prvSlr;                //부서 급여 합계 누적
                        ouf.write(String.format("%s \t %s \t %d \t %d \t %d \r\n", mb.dpt,mb.name,mb.slr,mb.addSlr,prvSlr));
                        if(!inf.hasNext()) {
                            ovrSlr+=dptSlr;
                            ouf.write(String.format("부서 합계 : %d\r\n", dptSlr));
                            ouf.write(String.format("전체 합계 : %d", ovrSlr));
                            inf.close();
                            ouf.close();
                            System.exit(0);
                        }
                        mb.dpt=inf.next();
                        mb.name=inf.next();
                        mb.slr=Integer.parseInt(inf.next());
                        mb.addSlr=Integer.parseInt(inf.next());
                    }while(dptChc.equals(mb.dpt));
                    
                    ovrSlr+=dptSlr;
                    ouf.write(String.format("부서 합계 : %d\r\n", dptSlr));
            }
            
        }catch (FileNotFoundException e) {
            // TODO: handle exception
        }catch(IOException e){
            System.out.println(e);
        }
    }    
}
 
class member{            //멤버 클래스
    String dpt=" ",name=" ";
    int slr=0, addSlr=0;
}
cs

*틀렸던 부분 :

> IO부분 다 까먹어서 IO 없이 하려다 로직이 안나와서 거의 보고 베낌...ㅠㅠㅠㅠ

> 실패코드 1

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
package Test.java;
import java.util.*;
import java.math.*;
import java.io.*;
import java.lang.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);//스캐너 객체 선언
        function1 f = new function1();        //기초자료 저장을 위한 객체 선언
        member[] mmb = new member[4];        //사원 4명의 객체를 저장할 객체 배열 선언
        mmb=f.saveData();                    //객체 배열에 기초자료 저장
 
        
        for(int i=0; i<mmb.length;i++)
            System.out.println(mmb[i].dpt+" "+mmb[i].name+" "+mmb[i].slr+" "+mmb[i].addSlr);
        
        System.out.printf("\t\t\t사원 급여표\n");
        System.out.printf("부서\t성명\t본봉\t수당\t합계\n");
    }    
}
 
 
class member{            //멤버 클래스
    String dpt=" ",name=" ";
    int slr=0, addSlr=0;
    void printMemberData() {
        System.out.print(dpt+" "+name+" "+slr+" "+addSlr);
    }
}
 
class function1{        //기초자료 저장
    member[] saveData() {
        member[] mmb = new member[4];
        for(int i=0; i<4; i++)
            mmb[i]=new member();
        mmb[0].dpt="영업";
        mmb[0].name="강현준";
        mmb[0].slr=1000;
        mmb[0].addSlr=100;
        
        mmb[1].dpt="영업";
        mmb[1].name="조충희";
        mmb[1].slr=1300;
        mmb[1].addSlr=140;    
        
        mmb[2].dpt="총무";
        mmb[2].name="이다인";
        mmb[2].slr=1200;
        mmb[2].addSlr=150;
        
        mmb[3].dpt="총무";
        mmb[3].name="강호정";
        mmb[3].slr=1500;
        mmb[3].addSlr=230;
        
        return mmb;
    }
}
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
37
38
39
40
41
42
43
44
45
46
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct member
{
    char bu[5], irum[10];
    int bon, su;
};
 
main()
{
    FILE *inf, *ouf;
    inf = fopen("data2.txt""r");
    ouf = fopen("result2.txt""w");
    struct member data;
    int gtot, butot, keb;
    char bubi[5];
    gtot = 0;
    fprintf(ouf, " \t \t사원 급여표\n");
    fprintf(ouf, "부서\t성명\t본봉\t수당\t합계\n");
    fscanf(inf, "%s %s %d %d", data.bu, data.irum, &data.bon, &data.su);
    while (1)
    {
        butot = 0;
        strcpy(bubi, data.bu);
        do
        {
            keb = data.bon + data.su;
            butot += keb;
            fprintf(ouf, "%s \t%s \t%d \t%d \t%d \n", data.bu, data.irum, data.bon, data.su, keb);
            if (fscanf(inf, "%s %s %d %d", data.bu, data.irum, &data.bon, &data.su) == EOF)
            {
                gtot += butot;
                fprintf(ouf, "부서 합계 : %d \n", butot);
                fprintf(ouf, "전체 합계 : %d", gtot);
                fclose(ouf);
                fclose(inf);
                exit(0);
            }
        } while (strcmp(bubi, data.bu) == 0);
        gtot += butot;
        fprintf(ouf, "부서 합계 : %d \n", butot);
    }
}
cs


데이터파일      8_1_java_data.txt

출력파일         8_1_java_result.txt


맨 위로



8-2. 실무응용(3)-동별, 나이별 인원 통계

> 다음의 처리 조건에 따라 동별, 나이별 통계를 구하는 코드를 작성.

> 동은 1~10까지 10개의 동이 있다.

> 동 코드로 0이 입력되면 종료한다.

> [색칠된 부분]은 제외하고 본문의 값들만 출력한다.

> 입력 형식

동 코드

성명

나이

DONG

IRUM

NAI

> 출력 형식

0~9

10~19

20~29

30~39

40~49

50~59

60 이상

합계

1

2

3

4

합계



내 코드(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.*;
import java.io.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        List<Member> mList = new ArrayList<>();
        Scanner in = new Scanner(System.in);
        
        int i=1add=1,age=1;
        String name=" ";
        
        do {                //입력부(동 입력 시 0을 입력하면 입력 종료)
            System.out.print("동 입력 : ");
            add=in.nextInt();
            if(add==0) {
                System.out.println("입력 종료.");
                break;
            }
            System.out.print("이름 입력 : ");
            name=in.next();
            System.out.print("나이 입력 : ");
            age=in.nextInt();
            mList.add(new Member(add,name,age));
        }while(i==1);    
        
        try {
            FileWriter ouf = new FileWriter("D:\\8_2_java_result.txt");
            int[][] tbl=new int[11][8];        //출력 될 숫자배열 생성
            
            for(int j=0; j<mList.size();j++) {        //저장부
                if(mList.get(j).age > 59)            //나이가 60 이상이면 60으로 수정
                    mList.get(j).setAge(60);
                tbl[mList.get(j).add-1][(mList.get(j).age/10)]++;//해당 동-연령대 위치에 값 +1
                tbl[mList.get(j).add-1][7]++;
                tbl[10][(mList.get(j).age/10)]++;
            }
            
            for(int j=0; j<11;j++) {        //출력부
                for(int k=0; k<8;k++) {
                    ouf.write(tbl[j][k]+" ");
                }
                ouf.write("\r\n");
                System.out.println(i);
            }
            ouf.close();
            
        }
        catch(FileNotFoundException e){
            //TODO: handle exception
        }
        catch(IOException e) {
            System.out.println(e);
        }
 
    }    
}
 
class Member {            //멤버 클래스
    String name="";
    int age=0,add=1;
    public Member(int a, String b, int c) {    //생성자
        this.add=a;
        this.name=b;
        this.age=c;
    }    
    public int getAge() {
        return age;
    }
    public void setAge(int aa) {
        age=aa;
    }    
}
cs

*틀렸던 부분 : 

> 29번 줄 FileWriter 선언, 객체생성 방법 까먹음

> 44번 줄 줄바꿈 문자 오류 (\n -> \r\n)

> 47번 줄 close메소드 빼먹음

교재 코드(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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
struct member
{
    int dong, nai;
    char irum[10];
};
 
main()
{
    FILE *ouf;
    ouf = fopen("result3.txt""w");
        struct member data;
    int a[11][8], i, j, row, col;
    for (i = 0; i <= 10; i++)
        for (j = 0; j <= 7; j++)
            a[i][j] = 0;
    printf("동 이름 나이를 입력하세요. \n모두 입력하셨으면 '0 0 0'을 입력하세요\n");
    while (1)
    {
        scanf("%d %s %d"&data.dong, data.irum, &data.nai);
        if (data.dong == 0)
            break;
        if (data.nai >= 60)
            data.nai = 60;
        row = data.dong - 1;
        col = data.nai / 10;
        a[row][col] += 1;
        a[row][7+= 1;
        a[10][col] += 1;
        a[10][7+= 1;
    }
    for (i = 0; i <= 10; i++)
    {
        for (j = 0; j <= 7; j++)
            fprintf(ouf, " %d", a[i][j]);
        fprintf(ouf, " \n");
    }
    fclose(ouf);
}
cs


출력파일 : 8_2_java_result.txt


맨 위로



8-3. 실무응용(4)-학급별 최대, 최소 체중

> 자료를 입력받은 후 출력 형식에 맞게 출력하는 순서도 작성

> 출력 형식 : 

번호

체중

1반

xx

xx

xx

xx

xx

xx

3반

xx

xx

xx

xx

xx

xx

4반

xx

xx

xx

xx

최소 체중 : 

xx

최대 체중 : 

xx

내 코드(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
package Test.java;
import java.util.*;
import java.io.*;
 
public class TestMain {
 
    public static void main(String[] args) {
        int maxWgh=0,minWgh=100,classNum=1;
        int stdClsNum=0,stdNum=0,stdWgh=0;
        
        try {
            Scanner inf = new Scanner(new FileReader("d:\\8_3_java_data.txt"));
            FileWriter ouf = new FileWriter("d:\\8_3_java_result.txt");
            
            ouf.write("반\t번호\t체중\r\n1반");    
            while(inf.hasNext()) {
                stdClsNum=inf.nextInt();
                stdNum=inf.nextInt();
                stdWgh=inf.nextInt();
                if(stdWgh>maxWgh)
                    maxWgh=stdWgh;
                if(stdWgh<minWgh)
                    minWgh=stdWgh;
                if(classNum != stdClsNum) {
                    ouf.write(stdClsNum+"반\t"+stdNum+"\t"+stdWgh+"\r\n");
                    classNum = stdClsNum;
                }else
                    ouf.write("\t"+stdNum+"\t"+stdWgh+"\r\n");                    
            }
            ouf.write("최소 체중 : "+minWgh+"\r\n"+"최대 체중 : "+maxWgh+"\r\n");    
            
            System.out.println("끝!");
            ouf.close();
            inf.close();
        }
        catch(FileNotFoundException e){
            //TODO: handle exception
        }
        catch(IOException e) {
            System.out.println(e);
        }
 
    }    
}
cs

*틀렸던 부분 : 

> 27번 else를 빼먹어서 출력이 중복됨

> \t 간격을 잘 못맞춰서 엇나감 -> 맞게 수정

교재 코드(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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
 
struct member
{
    char ban[4];
    int bunho, wgt;
};
 
main()
{
    struct member data[100];
    int flag, a, b, i, k;
    char c[4];
    printf("반 번호 무게를 입력하세요. \n모두 입력하셨으면 '0 0 0'을 입력하세요\n");
    flag = 0;
    i = k = -1;
    do {
        k++;
        scanf("%s %d %d", data[k].ban, &data[k].bunho, &data[k].wgt);
    } while (data[k].bunho != 0);
    printf("반\t번호\t체중\n");
    while (i < k - 1)
    {
        i++;
        if (flag == 0)
        {
            flag = 1;
            a = data[i].wgt;
            b = data[i].wgt;
        }
        else if (a > data[i].wgt)
            a = data[i].wgt;
        else if (b < data[i].wgt)
            b = data[i].wgt;
        if (strcmp(c, data[i].ban) == 0)
        {
            printf("  \t%d \t%d \n", data[i].bunho, data[i].wgt);
            continue;
        }
        strcpy(c, data[i].ban);
        printf("%s \t%d \t%d \n", data[i].ban, data[i].bunho, data[i].wgt);
    }
    printf("최소 체중:%d \n", a);
    printf("최대 체중:%d", b);
}
cs

데이터 파일 :  8_3_java_data.txt


출력 파일 : 8_3_java_result.txt



맨 위로



8-4. 실무응용(5)-사과 구입

> 3000원을 가지고 한 개에 200원, 300원, 400원인 사과를 각각 10개 이내에서 적절하게 조합하여 살 수 있는 코드를 작성.

> 단, 200원, 300원, 400원 짜리 사과를 각각 1개이상 사야하며, 전체 금액은 3000원이어야 한다.


내 코드(java)

*틀렸던 부분 : 

교재 코드(C)


맨 위로



8-5. 실무응용(6)-사과 나눠 갖기

내 코드(java)

*틀렸던 부분 : 

교재 코드(C)


맨 위로





Comments