MSM8994의 화룡점정 블로그
[JAVA] 정보처리 산업/기사 알고리즘 - 화폐매수 계산 본문
문제
다음 입력 형식과 같이 입력받은 후 화폐 단위별로 화폐의 매수를 계산하여 출력 형식에 맞게 출력하시오.
엄철식 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(); //종료 }
'코딩' 카테고리의 다른 글
[JSP] 단색 달력 JSP 출력 (0) | 2018.08.02 |
---|---|
[JAVA] 윤년 구하는 코드 짧게 작성하기 (0) | 2018.08.01 |
[JSP] 1부터 N까지의 자연수, 홀수, 짝수 합 구하기 (0) | 2018.07.30 |
[JS] Math.random() 을 활용한 중복이 없는 임의의 수 6개짜리 배열에 담기 (3) | 2018.07.27 |
[JS] 구구단 퀴즈 (Form 사용) (0) | 2018.07.26 |