MSM8994의 화룡점정 블로그

[JAVA] 정보처리 산업/기사 알고리즘 - 화폐매수 계산 본문

코딩

[JAVA] 정보처리 산업/기사 알고리즘 - 화폐매수 계산

msm8994 2018. 7. 31. 16:30
문제

다음 입력 형식과 같이 입력받은 후 화폐 단위별로 화폐의 매수를 계산하여 출력 형식에 맞게 출력하시오.


입력

엄철식 539620
양동수 538973
이동훈 173105


출력

						출장비지급표
성명    지급액 오만원  만원 오천원  천원 오백원  백원 오십원  십원  오원   일원
---------------------------------------------------------------------------
엄철식  539620    10     3     1     4     1     1     0     2     0     0
양동수  538973    10     3     1     3     1     4     1     2     0     3
이동훈  173105     3     2     0     3     0     1     0     0     1     0
---------------------------------------------------------------------------
전체 화폐 매수     23     8     2    10     2     6     1     4     1     3

처리조건

-화폐 단위는 50000원, 10000원, 5000원, 1000원, 500원, 100원, 50원, 10원, 5원, 1원의 10가지 종류가 있다.
-입력 데이터는 성명과 출장비 지급액이며, 입력된 성명이 QUIT 이면 입력의 끝이다.
- " / " 연산자는 나누기 연산의 몫을 구하는 것으로, 나누기 할 때 소수점 이하가 발생하면 버림으로 처리한다.

순서도는 책이나 문제에서 보셨을 것이므로 생략합니다.


코드 시작

먼저 입력을 처리하는 부분은 간단히 코드만 넣고 가겠습니다. 정보처리 실기에서 이런 결과를 예상하라는 문제는 안나오겠죠.

Scanner scn = new Scanner(System.in); // 시스템의 입력스트림을 사용하는 스캐너 객체 생성
StringBuilder input = new StringBuilder(); // 문자열 조립에 사용할 스트링 빌더 객체
// break 이전까지 계속 반복
while(true){
    String next = scn.nextLine();   // 다음 줄 입력 가져오기
    input.append(next.trim());      // 앞 뒤 빈 공간을 제거해서 조립
    input.append("\n");             // 줄바꿈 문자 조립
    if(next.equals("quit")){
        //입력 문자열이 "quit"이면 반복 종료
        break;
    }
}
scn.close();    // 스캐너 객체 닫기. (System.in)을 닫으므로 이후 입력은 받을 수 없게됩니다.
String strInput = input.toString(); // 조립결과를 문자열로 반환.


조립된 이 문자열을 처리해야겠죠? 문자열을 입력으로 받는 스캐너를 생성합니다.

Scanner inf = new Scanner(new StringReader(input)); // 입력 문자열 분석


순서도에서 준비에 해당하는 구역인 선언을 보겠습니다. 화폐가 10종이므로 10개짜리 배열을 선언합니다.

// 배열 선언 -----------------------------------------------------------------
// 0부터 9까지 5만원부터 1원까지 10가지 화폐별로 계산된 매수를 기억하는 배열
int pm[] = new int[10]; // 현재 계산중인 한 명 분
int tm[] = new int[10]; // 지금까지 계산된 모두의 지급액 기억

// 변수 선언 -----------------------------------------------------------------
String n;   // 성명
int p;      // 입력된 지급액

int t;      // 지급액를 화폐단위로 나눈 나머지가 기억될 변수
int m;      // 지금의 t 값을 나눌 화폐 단위
int sw;     // 화폐 단위를 5로 나눌까(50,->10,) 2로 나눌까(10,->5,) 판단할 스위치
int k;      // 10가지 화폐 중 어느 화폐 계산중인지 기억할 변수
// 선언 끝 -------------------------------------------------------------------


표 제목과 열 제목을 출력합니다.

// 출장비 표 제목 등 상단 출력
System.out.printf("\t\t\t\t\t\t\t출장비지급표\n");
System.out.printf("성명    지급액 오만원 만원 오천원 천원 오백원 백원 오십원 십원  오원  일원\n");
System.out.printf("---------------------------------------------------------------------------\n");


TM과 PM 각 배열의 원소들을 0으로 초기화합니다. 화폐가 10종이므로 10번 진행합니다.

// tm과 pm 배열 각 원소 0으로 초기화
for(k = 0; k < 10; k++){
    tm[k] = pm[k] = 0;
}


조건없는 반복 (가)를 시작합니다. 

// break 이전까지 조건없이 반복 ----------------------------------------------
while(true){
    // 반복 (가) 다음 사람의 지급액을 계산한다


이름과 지급액을 읽어오면서, 이름이 quit이라면 반복을 종료하고 나갑니다.

// 반복 (가) 다음 사람의 지급액을 계산한다

// 성명을 입력에서 가져옴
n = inf.next();

if(n.equals("quit")){
    // 성명이 "quit"이면
    // 반복 중단
    break;
}

// 지급액을 입력에서 가져옴
p = inf.nextInt();


임시변수 T에 지급액인 P 값을 넣고 M을 최고액인 5만원으로 초기화, 그 다음에 5로 나누라고 스위치를 올려둡니다. 이건 나중에 활용할 겁니다. 

// t에 지급액을 넣습니다.
t = p;
// 처음 계산할 화폐 단위는 가장 큰 단위인 5만원
m = 50000;
// 5만원 다음 화폐는 1만원이므로 5로 나누기 위해 스위치 올림
sw = 1;


화폐단위가 5만원부터 1원까지 10종입니다. 10번 반복하도록 하죠

// 화폐 단위가 5만원부터 1원까지 10가지 이므로 10번 반복.
for(k = 0; k < 10; k++){


반복 (나)를 시작합니다. PM의 K번 원소에 T를 M으로 나눈 몫을 넣고, T에는 그 나머지를 넣습니다.

// 반복 (나) 각 화폐단위별로 지급 매수를 계산한다

// pm의 k번 원소에 t를 m으로 나눈 몫을 기억
pm[k] = t / m;
// t를 m으로 나눈 나머지 기억
t = t - (pm[k] * m);


아까 5로 나누라고 스위치를 올린다고 했죠? 그걸 구현합니다. 1이면 M을 5로 나누고,(5만원 -> 1만원) 아니면 2로 나누고(1만원 -> 5천원) 스위치를 바꿔줍니다. 

// 스위치 여부에 따라 다음 화폐 단위 결정
if(sw == 1){ // 스위치가 올려져 있으면
    // m을 5로 나눈 몫을 m에 기억
    m = m / 5;
    // sw 내림
    sw = 0;

}else{  //스위치가 내려져 있으면
    // m을 2로 나눈 몫을 m에 기억
    m = m / 2;
    // sw 올림
    sw = 1;
}


반복 (나)를 닫습니다.

// 다음 반복 (나)로 이동
}


성명과 지급액을 미리 출력해둡니다.

// 성명과 지급액을 출력
System.out.printf("%s %7d", n, p);


화폐 권종별 매수인 PM을 출력합니다. 그와 동시에 합산된 값을 TM에 넣습니다.

for(k = 0; k < 10; k++){
    // 각 화폐 단위별로 계산 완료된 지급 매수 pm 출력
    System.out.printf(" %5d", pm[k]);
    // 각 화폐 단위별 지급 매수 pm을 tm에 합산
    tm[k] = tm[k] + pm[k];
}


줄바꿈하고 반복 (가)의 다음 반복을 진행합니다. 이러면 (가)의 맨 처음으로 가서 다음 사람의 계산을 시작하게 되겠죠.

    // 다음 줄로 줄바꿈
    System.out.printf("\n");

    // 다음 반복 (가)로 이동
}


반복(가)가 quit 입력으로 인해 끝났습니다. 소제목을 출력하고 전체 화폐 매수를 출력하겠습니다.

// 가로줄 이후 전체 화폐 매수 출력 -------------------------------------------
System.out.printf("---------------------------------------------------------------------------\n");
System.out.printf("전체 화폐 매수");


각 화폐 권종별로 총 지급매수 TM을 출력합니다.

// 각 화폐 단위별로 총 지급 매수 tm 출력
for(k = 0; k < 10; k ++){
    System.out.printf(" %5d", tm[k]);
}

// 줄 바꿈
System.out.printf("\n");


자열 분석용 스캐너를 닫고 종료합니다.

// 입력 문자열 분석기 닫음
inf.close();

//종료


끝났습니다.
이 부분을 함수로 꺼내겠습니다.



입력부를 제외한 전체 소스코드(함수)
private static void algo01_switch(String input){
    Scanner inf = new Scanner(new StringReader(input)); // 입력 문자열 분석용 스캐너

    // 배열 선언 -----------------------------------------------------------------
    // 0부터 9까지 5만원부터 1원까지 10가지 화폐별로 계산된 매수를 기억하는 배열
    int pm[] = new int[10]; // 현재 계산중인 한 명 분
    int tm[] = new int[10]; // 지금까지 계산된 모두의 지급액 기억

    // 변수 선언 -----------------------------------------------------------------
    String n;   // 성명
    int p;      // 입력된 지급액

    int t;      // 지급액를 화폐단위로 나눈 나머지가 기억될 변수
    int m;      // 지금의 t 값을 나눌 화폐 단위
    int sw;     // 화폐 단위를 5로 나눌까(50,->10,) 2로 나눌까(10,->5,) 판단할 스위치
    int k;      // 10가지 화폐 중 어느 화폐 계산중인지 기억할 변수
    // 선언 끝 -------------------------------------------------------------------

    // 출장비 표 제목 등 상단 출력
    System.out.printf("\t\t\t\t\t\t\t출장비지급표\n");
    System.out.printf("성명    지급액 오만원 만원 오천원 천원 오백원 백원 오십원 십원  오원  일원\n");
    System.out.printf("---------------------------------------------------------------------------\n");

    // tm과 pm 배열 각 원소 0으로 초기화
    for(k = 0; k < 10; k++){
        tm[k] = pm[k] = 0;
    }

    // break 이전까지 조건없이 반복 ----------------------------------------------
    while(true){

        // 반복 (가) 다음 사람의 지급액을 계산한다

        // 성명을 입력에서 가져옴
        n = inf.next();

        if(n.equals("quit")){
            // 성명이 "quit"이면
            // 반복 중단
            break;
        }

        // 지급액을 입력에서 가져옴
        p = inf.nextInt();

        // t에 지급액을 넣습니다.
        t = p;
        // 처음 계산할 화폐 단위는 가장 큰 단위인 5만원
        m = 50000;
        // 5만원 다음 화폐는 1만원이므로 5로 나누기 위해 스위치 올림
        sw = 1;

        // 화폐 단위가 5만원부터 1원까지 10가지 이므로 10번 반복.
        for(k = 0; k < 10; k++){
            // 반복 (나) 각 화폐단위별로 지급 매수를 계산한다

            // pm의 k번 원소에 t를 m으로 나눈 몫을 기억
            pm[k] = t / m;
            // t를 m으로 나눈 나머지 기억
            t = t - (pm[k] * m);

            // 스위치 여부에 따라 다음 화폐 단위 결정
            if(sw == 1){ // 스위치가 올려져 있으면
                // m을 5로 나눈 몫을 m에 기억
                m = m / 5;
                // sw 내림
                sw = 0;

            }else{  //스위치가 내려져 있으면
                // m을 2로 나눈 몫을 m에 기억
                m = m / 2;
                // sw 올림
                sw = 1;
            }
            // 다음 반복 (나)로 이동
        }

        // 성명과 지급액을 출력
        System.out.printf("%s %7d", n, p);

        for(k = 0; k < 10; k++){
            // 각 화폐 단위별로 계산 완료된 지급 매수 pm 출력
            System.out.printf(" %5d", pm[k]);
            // 각 화폐 단위별 지급 매수 pm을 tm에 합산
            tm[k] = tm[k] + pm[k];
        }

        // 다음 줄로 줄바꿈
        System.out.printf("\n");

        // 다음 반복 (가)로 이동
    }

    // 가로줄 이후 전체 화폐 매수 출력 -------------------------------------------
    System.out.printf("---------------------------------------------------------------------------\n");
    System.out.printf("전체 화폐 매수");

    // 각 화폐 단위별로 총 지급 매수 tm 출력
    for(k = 0; k < 10; k ++){
        System.out.printf(" %5d", tm[k]);
    }

    // 줄 바꿈
    System.out.printf("\n");

    // 입력 문자열 분석용 스캐너 닫음
    inf.close();

    //종료
}


Comments