수월하게 푼 것도 있고 시간을 많이 쓴 것도 있는데 피드백 주신 사항들로 다시 리뷰 해보려고 한다.
1번 구구단 출력 5/5
- 구구단 출력 조건문을 i < 10 보다 i <= 9를 쓰는게 가독성이 높다.
public class JavaStudy01 {
public static void main(String args[]){
System.out.println("[구구단 출력]");
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
System.out.print(String.format("%02d X %02d = %02d \t",j,i,j*i));
}
System.out.println("");
}
}
}
2번 캐시백 계산 프로그램 4/5
- 캐시백 비율에 맞게 캐시백금액을 구한 이후에 보정 처리 하는게 좋을 것 같다.
원래 코드
import java.util.Scanner;
public class JavaStudy02 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("[캐시백 계산]");
System.out.print("결제 금액을 입력해 주세요.(금액):");
int price = scanner.nextInt();
int cashBack = (int)(price * 0.1);
if(cashBack > 300) cashBack = 300;
else cashBack = cashBack/100 * 100;
System.out.println("결제 금액은 "+price+"원이고, 캐시백은 "+cashBack+"원 입니다.");
scanner.close();
}
}
보정처리가 무슨 말이지 ? 했다. 캐시백 금액을 구하고 ... 음..
무슨말인가 했더니 캐시백 금액이 300원이 넘어가는 부분이 보정처리인 것 같다.
그래서 일단 상품금액의 10% 캐시백 계산을 하고 else 문에 작성한 백원단위로 뽑는부분을 위로 올리고 그다음에 그 금액이 300원이 넘으면 캐시백은 300원이 되도록. 오켕
그리고 입력받은 price를 (double)로 안 바꿔줘도 지금 연산에서는 이상이 없지만
아주 정확한 값을 얻는 건 아니기 때문에 바꿔주는 걸 의식해보
import java.util.Scanner;
public class JavaStudy02 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("[캐시백 계산]");
System.out.print("결제 금액을 입력해 주세요.(금액):");
int price = scanner.nextInt();
int cashBack = (int)((double)price * 0.1);
cashBack = cashBack/100 * 100;
if(cashBack > 300) cashBack = 300;
System.out.println("결제 금액은 "+price+"원이고, 캐시백은 "+cashBack+"원 입니다.");
scanner.close();
}
}
3번 놀이동산 입장권 계산 프로그램 8/10
- 동일한 입장료에 대한 부분은 || 연산자를 이용하여 처리, 조건처리도 연달아 if보다는 if,else if, else if로 처리
import java.util.Scanner;
public class JavaStudy03 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("[입장권 계산]");
System.out.print("나이를 입력해 주세요.(숫자):");
int age = scanner.nextInt();
System.out.print("입장시간을 입력해 주세요.(숫자입력):");
int time = scanner.nextInt();
System.out.print("국가유공자 여부를 입력해 주세요.(y/n):");
char country = scanner.next().charAt(0);
System.out.print("복지카드 여부를 입력해 주세요.(y/n):");
char card = scanner.next().charAt(0);
int price = 10000;
if(card == 'y' || country == 'y') price = 8000;
if(age>=3 && age<13) price = 4000;
if(time>17) price = 4000;
if(age < 3) price = 0;
System.out.println("입장료: "+price);
scanner.close();
}
}
근데 사실 if를 줄줄이 쓴 이유가 있었는데 만약에 위에서 조건을 만족하면 아래에 안 걸려버리니까 더 큰 금액을 할인 받을 수 있어도 위에서 걸리고 만다. 엥 . . 그럼 가장 큰 할인 받을 수 있는 조건부터 위에다 쓰고 if, else if로 쓰면 되잖아 ?
import java.util.Scanner;
public class JavaStudy03 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("[입장권 계산]");
System.out.print("나이를 입력해 주세요.(숫자):");
int age = scanner.nextInt();
System.out.print("입장시간을 입력해 주세요.(숫자입력):");
int time = scanner.nextInt();
System.out.print("국가유공자 여부를 입력해 주세요.(y/n):");
String country = scanner.next();
System.out.print("복지카드 여부를 입력해 주세요.(y/n):");
String card = scanner.next();
int price = 10000;
if(age < 3) price = 0;
else if(age<13 || time > 17) price = 4000;
else if("y".equalsIgnoreCase(card) || "y".equalsIgnoreCase(country)) price = 8000;
System.out.println("입장료: "+price);
scanner.close();
}
}
* 완성은 했는데 새로 또 자각한 사실. String을 equals로 당연히 비교하는 걸로 알고있었는데
String은 클래스이고 클래스는 참조변수 형태로 값을 저장하니까
String str = "abc" 라고 하고 if( str == "abc") 를 하면 false. 서로 저장된 주소값이 다름
그래서 equals로 비교해주는 거임 !!!
* 또 하나 처음 안 거 !! String.equalsIgnoreCase()를 쓰면 대소문자 구분 없이 문자열 비교가 가눙....
*국가유공자 여부와 복지카드 여부를 비교할 때 null이 아닌 경우를 고려해줘야하는데
card != null && card.equalsIgnoreCase("y"); 보다는
"y".equalsIgnoreCase(card); 로 실무에서 쓴다 ... 대박인게 문자열 저 자체는 애초에 null이 될 수가 없잖아 그래서 그런 가봐 우와.. 먼가 깨달은 느낌
4번 주민번호 생성 프로그램 8/10
- int rand = (int)(Math.random() * 999999)+1; 로 처리를 하게되면, 작은 값이 나오는 경우, 주민번호의 자릿수가 맞지 않기 때문에 실행한 이후에 format 함수로 자릿수에 맞게 작성하는게 좋을 것 같다.
원래 코드
import java.util.Scanner;
public class JavaStudy04 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int rand = (int)(Math.random() * 999999)+1;
System.out.println("[주민등록번호 계산]");
System.out.print("출생년도를 입력해 주세요.(yyyy):");
String year = scanner.next().substring(2);
System.out.print("출생월을 입력해 주세요.(mm):");
String month = scanner.next();
System.out.print("출생일을 입력해 주세요.(dd):");
String day = scanner.next();
System.out.print("성별을 입력해 주세요.(m/f):");
char gender = scanner.next().charAt(0);
sb.append(year).append(month).append(day).append("-");
if(gender == 'm'){
sb.append(3);
}
else{
sb.append(4);
}
sb.append(rand);
System.out.println(sb);
scanner.close();
}
}
아니 문제에서 애초에 random함수의 nextInt() 함수 통해서 하라고 써있는데 걍 무시해버리고 했네 .. ㅋㅋ
이게 무지의 위험이다 진짱 모르니까 내가 아는 걸로 냅다 풀어버리네..완전 저게 맞는 말인게 999999 이하의 수가 랜덤으로 나오니까 막 1000 이 나와버리면 자릿수가 안 맞는다 !테스트할 땐 왜 몰랐지 운 좋게 숫자가 잘 나왔었나보다..random.nextInt(숫자) //괄호 안의 숫자를 기준으로 0~숫자까지의 모든 숫자를 랜덤으로 출력한다.
import java.util.Random;
import java.util.Scanner;
public class JavaStudy04 {
public static String createJuminNo(int year, String month, String day, String gender){
String rand = "";
Random random = new Random();
for (int i = 1; i <= 6; i++) {
rand += random.nextInt(10) ;
}
int genderValue = "m".equalsIgnoreCase(gender) ? 3 : 4;
String 주민번호 = String.format("%02d%s%s-%d%s", year - 2000, month, day, genderValue, rand);
return 주민번호;
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
System.out.println("[주민등록번호 계산]");
System.out.print("출생년도를 입력해 주세요.(yyyy):");
//String year = scanner.next().substring(2);
int year = scanner.nextInt();
System.out.print("출생월을 입력해 주세요.(mm):");
String month = scanner.next();
System.out.print("출생일을 입력해 주세요.(dd):");
String day = scanner.next();
System.out.print("성별을 입력해 주세요.(m/f):");
String gender = scanner.next();
System.out.println(createJuminNo(year, month, day, gender));
scanner.close();
}
}
5번 달력 출력 프로그램 10/10
- 완 벽 !
import javafx.util.converter.LocalDateStringConverter;
import java.time.LocalDate;
import java.util.Locale;
import java.util.Scanner;
public class JavaStudy05 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("[달력 출력 프로그램]");
System.out.print("달력의 년도를 입력해 주세요.(yyyy):");
int year = scanner.nextInt();
System.out.print("달력의 월을 입력해 주세요.(mm):");
int month = scanner.nextInt();
System.out.printf("[%d년 %02d월]\n",year,month);
System.out.println("일\t"+"월\t"+"화\t"+"수\t"+"목\t"+"금\t"+"토\t");
LocalDate calender = LocalDate.of(year,month,1);
int day = calender.getDayOfWeek().getValue(); //해당 달이 시작하는 요일
int cntDay = calender.lengthOfMonth();
if(day != 7) {
for (int i = 0; i < day; i++) {//시작 요일만큼 공백
System.out.print("\t");
}
}
int date=1;
for(int i=0;i<cntDay;i++){
System.out.printf("%02d\t",date);
day++; date++;
if(day%7==0){
System.out.println();
}
}
scanner.close();
}
}
캘린더 함수를 처음 써봤다 .. 좀 어려웠던 거 같아
메소드 정리
LocalDate localDate = new LocalDate.of(year, month, 1); //year년도 month달 1일의 데이터를 가짐.
localDate.getDayOfWeek(); // 시작하는 요일 출력 (문자열 WEDNES 출력)
localDate.getDayOfWeek().getValue(); // 2가 출력됨.
localDate.lengthOfMonth(); // 해당 달의 일 수 31이 출력됨.
localDate.plusMonths(1).minusDays(1).getDayOfMonth(); // 3월에서 한 달 더한 4월 1일에서 1일을 빼면 3월의 마지막 날 그 날의 일자를 getDayOfMonth()로 가져옴.
강사님코드 마지막에 StringBuilder로 바꿔서 출력
import java.time.LocalDate;
import java.util.Scanner;
public class JavaStudy05 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
System.out.println("[달력 출력 프로그램]");
System.out.print("달력의 년도를 입력해 주세요.(yyyy):");
int year = scanner.nextInt();
System.out.print("달력의 월을 입력해 주세요.(mm):");
int month = scanner.nextInt();
System.out.printf("[%d년 %02d월]\n",year,month);
String []title = {"일","월","화","수","목","금","토"};
LocalDate localDate = LocalDate.of(year,month,1);
int preFixCount = localDate.getDayOfWeek().getValue();
int lastDay = localDate.plusMonths(1).minusDays(1).getDayOfMonth();
int totalCount = 0;
for (int i = 0; i < title.length; i++) {
//System.out.print(title[i] + "\t");
sb.append(title[i] + "\t");
}
sb.append("\n");
for (int i = 0; i < preFixCount; i++) {
//System.out.print(" " + "\t");
sb.append(" " + "\t");
totalCount ++;
}
for (int i = 1; i <= lastDay ; i++) {
//System.out.printf("%02d \t",i);
sb.append(i + "\t");
totalCount ++;
if(totalCount % 7 == 0){
//System.out.println();
sb.append("\n");
}
}
System.out.println(sb);
scanner.close();
}
}
6번 가상 선거 당선 시뮬레이션 프로그램 20/20
- 완벽 !
얘 엄청 신경써서 오래걸려서 했었던 기억이 난다.
계산이 까다로웠지 뭐 크게 어려웠던 거 같진 않다.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class JavaStudy06 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("총 진행할 투표수를 입력해 주세요.");
int voteCount = scanner.nextInt();
System.out.print("가상 선거를 진행할 후보자 인원을 입력해 주세요.");
int applicant = scanner.nextInt();
String name[] = new String[applicant];
HashMap<Integer,String[]> map = new HashMap<>();
for(int i = 0;i < applicant ; i++){
System.out.print((i+1)+"번째 후보자이름을 입력해 주세요.");
String namee = scanner.next();
String arr[] = new String[2];
name[i] = namee;
arr[0] = namee;
arr[1] = "0";
map.put((i+1),arr);
//map에 key값으로 기호번호 부여, value로는 이름과 투표수(0으로 기본 초기화)
}
for (int i = 1; i <= voteCount ; i++) {
int random = (int)(Math.random() * applicant) + 1;
String array[] = map.get(random); // map의 value값 이름, 투표수를 가져옴.
array[1] = Integer.toString(Integer.parseInt(array[1])+1);
map.put(random,array);
System.out.println();
System.out.printf("[투표진행률]: %.2f%%, %d명 투표 => %s\n",(float)i/voteCount*100,i,name[random-1]);
float rate = 0.0f;
int cntVote = 0;
for (int j = 0; j < applicant; j++) {
if(map.get(j+1)[1].equals("0")){
rate = 0.0f;
cntVote = 0;
}
else{
rate = (float)i/voteCount*100*Integer.parseInt(map.get(j+1)[1])/i;
cntVote = Integer.parseInt(map.get(j+1)[1]);
}
String nameStr = map.get(j+1)[0] + ":";
System.out.printf("[기호:%d] %-10s\t%.2f%%\t(투표수: %d)\n",j+1,nameStr,rate,cntVote);
}
System.out.println();
}
//투표수 제일 많은 사람 찾기
String winPerson = "";
int max = 0;
for (int i = 0; i < map.size(); i++) {
int temp = Integer.parseInt(map.get(i+1)[1]);
if( temp > max){
max = temp;
winPerson = map.get(i+1)[0];
}
}
System.out.println("[투표결과] 당선인 : "+winPerson);
scanner.close();
}
}
클래스를 만들어서 private으로 멤버변수들을 지정하고 getter,setter 메소드를 이용해 멤버에 접근 -> 캡슐화
후보자들 정보와 출력하는 메소드를 정의해놓은 후보자 클래스.
멤버 변수 선언 위치가 클래스 내부이면 정수는 0으로 boolean은 false로 객체는 null로 기본 초기환된다
public class 후보자 {
private int no;
private String name;
private int totalVoteCount;
private int voteCount;
public 후보자(int no, String name){
this.no = no;
this.name = name;
}
public String getDisplayInfo(){
double rate = (double) voteCount * 100 / totalVoteCount;
String msg = String.format("[기호: %d] %s: %f %%, (투표수: %d)",
no, name, rate, voteCount );
return msg;
//System.out.println(msg);
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTotalVoteCount() {
return totalVoteCount;
}
public void setTotalVoteCount(int totalVoteCount) {
this.totalVoteCount = totalVoteCount;
}
public int getVoteCount() {
return voteCount;
}
public void setVoteCount(int voteCount) {
this.voteCount = voteCount;
}
/**
* 투표수 하나 증가
*/
public void addVote() {
voteCount++;
}
}
import java.util.*;
public class JavaStudy06 {
public static void main(String[] args){
List<후보자> 후보자들 = new ArrayList<>();
후보자들.add(new 후보자(1, "이재명"));
후보자들.add(new 후보자(2, "윤석렬"));
후보자들.add(new 후보자(3, "안철수"));
후보자들.add(new 후보자(4, "심상정"));
int voteCount = 100;
int min = 0;
int max = 3;
Random random = new Random();
int i = 0;
for (i = 1; i <= voteCount ; i++) {
int vote = random.nextInt(max - min + 1) + min;
후보자들.get(vote).addVote();
System.out.printf("[투표진행률]: %.2f%%, %d명 투표 => %s\n",(float)i/voteCount*100,i,후보자들.get(vote).getName());
for (후보자 x : 후보자들) {
x.setTotalVoteCount(i);
String msg = x.getDisplayInfo();
System.out.println(msg);
}
System.out.println();
}
Scanner scanner = new Scanner(System.in);
System.out.print("총 진행할 투표수를 입력해 주세요.");
// int voteCount = scanner.nextInt();
System.out.print("가상 선거를 진행할 후보자 인원을 입력해 주세요.");
int applicant = scanner.nextInt();
//System.out.println("[투표결과] 당선인 : "+winPerson);
scanner.close();
}
}
7번 로또 당첨 프로그램 18/20
- 로또 번호 생성할 때 중복처리에 대한 부분 로직에서
for (int j = 0; set.size() < 6; j++) {
set.add((int)(Math.random()*45)+1); //로또 번호 랜덤 생성
}이부분도 좋긴하지만, 중복 숫자를 뽑은 다음에 다시 빼지 말고, 이미 뽑은 숫자에 대해서는 다음에 뽑을때 뽑히지 않도록 하는 방법을 고민하면 좋을 것 같다.
//박소은
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
public class JavaStudy07 {
//중복 없는 랜덤 로또번호 생성후 정렬해 줄 메소드
public static LinkedList randomNum(int cnt){
HashSet set = new HashSet();//랜덤한 로또 번호를 중복없이 저장해 줄 자료구조
for (int j = 0; set.size() < 6; j++) {
set.add((int)(Math.random()*45)+1); //로또 번호 랜덤 생성
}
LinkedList list = new LinkedList(set); //정렬을 위해 list에 담아줌
Collections.sort(list); //Collections.sort로 정렬
return list;
}
//로또 값 출력해 줄 메소드
public static void numPrint(LinkedList list){
for (int j = 0; j < list.size(); j++) {
System.out.printf("%02d",list.get(j));
if(j!=5) System.out.print(",");
}
}
public static void main(String []args) {
Scanner scanner = new Scanner(System.in);
System.out.println("[로또 당첨 프로그램]\n");
//로또 개수 입력
System.out.print("로또 개수를 입력해 주세요.(숫자 1 ~ 10):");
int cnt = scanner.nextInt();
LinkedList arr[] = new LinkedList[cnt]; //set으로 받은 로또 한 개의 6개 번호가 정렬되어 들어갈 배열
for(int i=0;i<cnt;i++){
System.out.print((char)(i+65)+"\t");
LinkedList list = randomNum(cnt);
arr[i] = list; //추후에 또 쓰이므로 ArrayList형의 배열 arr에 번호 6개 세트 하나씩 저장
numPrint(list);
System.out.println();
}
System.out.println();
//당첨 번호 생성
System.out.println("[로또 발표]");
LinkedList list1 = randomNum(cnt);
System.out.print("\t");
numPrint(list1);
System.out.println("\n");
//당첨확인
System.out.println("[내 로또 결과]");
for (int i = 0; i < cnt; i++) { //로또 갯수만큼 당첨 확인 반복
int winCount = 0;
System.out.print((char)(i+65)+"\t");
numPrint(arr[i]);
for (int j = 0; j < 6; j++) {
if(arr[i].contains(list1.get(j))) winCount ++;
}
System.out.println(" => "+winCount+"개 일치");
}
}
}
나는 set자료구조를 써서 이미 뽑은 다음에 중복값이 들어가지 않도록 하는 방법을 사용했다. 이거 강의에서 강사님이랑 비슷한 거 해봐서 외워버렸음 ㅋㅋ
음 근데 이미 뽑은 숫자를 안 뽑게하려면 ...
for (int j = 0; set.size() < 6; j++) {
while(true){
int rand = (int)(Math.random()*45)+1 ;
if(!set.contains(rand)){
set.add(rand);
break;
}
}
}
이렇게로 바꿔봤는데 이것도 이미 중복숫자를 뽑고 비교하는 거 아닌가 ? 음..
강사님은 배열에 1~45 숫자를 담아놓고 리스트로 바꾼다음에 여기서 뽑고 뽑은 거는 list에서 지워버리는 식으로 중복된 숫자는 다시 뽑을 수 없게 함. 근데 코드가 좀 비효율 적인 거 같아 계속계속 출력하는 부분을 함수로 만들면 더 좋을 것 같다.
//박소은
import java.util.*;
public class JavaStudy07 {
//중복 없는 랜덤 로또번호 생성후 정렬해 줄 메소드
public static LinkedList randomNum(int cnt){
HashSet <Integer>set = new HashSet();//랜덤한 로또 번호를 중복없이 저장해 줄 자료구조
for (int j = 0; set.size() < 6; j++) {
while(true){
int rand = (int)(Math.random()*45)+1 ;
if(!set.contains(rand)){
set.add(rand);
break;
}
}
}
LinkedList list = new LinkedList(set); //정렬을 위해 list에 담아줌
Collections.sort(list); //Collections.sort로 정렬
return list;
}
//로또 값 출력해 줄 메소드
public static void numPrint(LinkedList list){
for (int j = 0; j < list.size(); j++) {
System.out.printf("%02d",list.get(j));
if(j!=5) System.out.print(",");
}
}
public static void main(String []args) {
Scanner scanner = new Scanner(System.in);
System.out.println("[로또 당첨 프로그램]\n");
//로또 개수 입력
System.out.print("로또 개수를 입력해 주세요.(숫자 1 ~ 10):");
int lottoCount = scanner.nextInt();
int LOTTO_COUNT = 6;
int[][] userLotto = new int[lottoCount][LOTTO_COUNT];
int[] userLottoCount = new int[lottoCount];
int[] winLotto = {0,0,0,0,0,0};
Integer[] arrNo = { 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,3,5,36,37,38,39,40,41,42,43,44,45};
Random random = new Random();
for (int i = 0; i < lottoCount; i++) {
ArrayList <Integer> noList = new ArrayList<>(Arrays.asList(arrNo));
for (int j = 0; j < LOTTO_COUNT; j++) {
int min = 0;
int max = noList.size();
int index = random.nextInt(max) + min;
int no = noList.get(index);
userLotto[i][j] = no;
noList.remove(index);
}
}
//정렬
for (int i = 0; i < lottoCount; i++) {
Arrays.sort(userLotto[i]);
}
//구매로또 출력
for (int i = 0; i < lottoCount; i++) {
System.out.print((char)(i + 65)+"\t");
for (int j = 0; j < LOTTO_COUNT; j++) {
if(j > 0){
System.out.print(", ");
}
System.out.print(String.format("%02d",userLotto[i][j]));
} System.out.println();
}
System.out.println("[로또 발표]");
System.out.print("\t");
ArrayList <Integer> noList = new ArrayList<>(Arrays.asList(arrNo));
for (int j = 0; j < LOTTO_COUNT; j++) {
int min = 0;
int max = noList.size();
int index = random.nextInt(max) + min;
int no = noList.get(index);
winLotto[j] = no;
noList.remove(index);
}
//로또 발표 정렬
Arrays.sort(winLotto);
for (int j = 0; j < LOTTO_COUNT; j++) {
if(j > 0){
System.out.print(", ");
}
System.out.print(String.format("%02d",winLotto[j]));
} System.out.println("\n");
//당첨확인
System.out.println("[내 로또 결과]");
for (int i = 0; i < lottoCount; i++) {
int cnt = 0;
System.out.print((char)(i + 65)+"\t");
for (int j = 0; j < LOTTO_COUNT; j++) {
for (int k = 0; k < LOTTO_COUNT; k++) {
if(userLotto[i][j] == winLotto[k]){
cnt ++;
break;
}
}
}
for (int j = 0; j < LOTTO_COUNT; j++) {
if(j > 0){
System.out.print(", ");
}
System.out.print(String.format("%02d",userLotto[i][j]));
} System.out.println(" => "+cnt+"개 일치");
}
}
}
8번 연소득 과세금액 계산 프로그램 20/20
- 이 문제의 경우, 코드를 구현하는 부분에 중요한 부분이기 하지만,
주어진 문제를 정확히 이해하고 분석하여 이를 데이터 구조를 잘 만드는 부분을 좀더 고민해 주시면 좋을 듯 합니다.
import java.util.ArrayList;
import java.util.Scanner;
public class JavaStudy08 {
//세율계산 메소드
public static int rateCal(double rate,int income){
return (int)(rate * income);
}
public static int[] saveArr(int tempIncome,double rate,int taxPrice){
int result[] = new int[3];
result[0] = tempIncome;
result[1] = (int)(rate*100);
result[2] = taxPrice;
return result;
}
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
System.out.println("[과세금액 계산 프로그램]");
System.out.print("연소득을 입력해 주세요.:");
int income = scanner.nextInt();
int income2 = income;
int tempIncome = income;
int taxStandard[] = {12000000,46000000,88000000,150000000,300000000,500000000,1000000000};
double taxRate[] = {0.15,0.24,0.35,0.38,0.40,0.42,0.45};
int totalStandard[] = {1080000,5220000,14900000,19400000,25400000,35400000,65400000};
int taxResult1 = 0;
int taxResult2 = 0;
ArrayList <int[]> list = new ArrayList<>();
//세금이용한 세율계산
for(int i = taxStandard.length-1; i >= 0; i--){
if(income > taxStandard[i]){
tempIncome = income - taxStandard[i];
income -= tempIncome;
taxResult1 += rateCal(taxRate[i],tempIncome);
list.add(0,saveArr(tempIncome,taxRate[i],rateCal(taxRate[i],tempIncome)));
}
}
//1200만원 이하 세율계산
taxResult1 += rateCal(0.06, taxStandard[0]);
list.add(0,saveArr(taxStandard[0],0.06,rateCal(0.06, taxStandard[0])));
//누진공제 이용한 세율계산
for (int i = 0; i < taxStandard.length; i++) {
if(income2 > taxStandard[i]){
taxResult2 = Math.round(rateCal(taxRate[i],income2)*10)/10 - totalStandard[i];
}
}
for (int i = 0; i < list.size(); i++) {
System.out.printf("%10d * %2d%% = %10d",list.get(i)[0],list.get(i)[1],list.get(i)[2]);
System.out.println();
}
System.out.println();
System.out.printf("%-19s \t\t%10d\n","[세율에 의한 세금]:",taxResult1);
System.out.printf("%-19s \t%10d\n","[누진공제 계산에 의한 세금]:",taxResult2);
scanner.close();
}
}
흠 피드백이 또 ㅜ슨 말ㅇ리까 ? 데이터 구조를 잘 만들어라 ????
너무 하드코딩이라 이건 그냥 이해하고 넘어가기로 했다.
과세표준의 금액 기준에 따라 if elseif문으로 죄다 작성한다.
이런식으로 하면 더 가독성 높고 깔끔해보이긴 한다.
미니과제 리뷰 끝 ! 해설 강의가 4시간 짜리여서 굉장히 오래걸렸다.
만점을 받았거나 손쉽게 풀었던 문제 내용들 안에서도 중간중간 새로운 내용들을 들을 수 있어서 건너뛰지 않고 다 들었다.
실제 고수들은 어떤 코딩 스타일을 가지고 있는지 궁금했는데 유익했던 것 같다 !
'ZB 백엔드 스쿨 > 과제' 카테고리의 다른 글
SQLite 설치하고 DataGrip에 연결 (테이블 생성 완료) (0) | 2023.09.02 |
---|---|
서울시 공공와이파이 정보 OPEN API 받아오기 - (파싱까지 완료) (0) | 2023.09.02 |
Mission1 깜짝과제 03.html 페이징 처리 (0) | 2023.08.12 |
Mission1 깜짝과제 02.조건에 맞는 프로그램 작성하기 (0) | 2023.08.12 |
Mission1 깜짝과제 01. 자바에서 html 문서 작성하기 (0) | 2023.08.12 |