본문 바로가기
ZB 백엔드 스쿨/과제

미니과제 리뷰

by son_i 2023. 7. 24.
728x90

수월하게 푼 것도 있고 시간을 많이 쓴 것도 있는데 피드백 주신 사항들로 다시 리뷰 해보려고 한다.

 

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시간 짜리여서 굉장히 오래걸렸다. 

만점을 받았거나 손쉽게 풀었던 문제 내용들 안에서도 중간중간 새로운 내용들을 들을 수 있어서 건너뛰지 않고 다 들었다.

실제 고수들은 어떤 코딩 스타일을 가지고 있는지 궁금했는데 유익했던 것 같다 !