wisePocket

[Algorithm] 옷가게 할인 적용 계산기 만들기 본문

Java & Algorithm/Algorithm Practice

[Algorithm] 옷가게 할인 적용 계산기 만들기

ohnyong 2023. 8. 6. 22:21

옷가게 처럼 상품의 원가와 금액별 할인율을 적용하여 계산서를 만들어주는 계산기 만들기

정해진 나의 룰에 따라서 연습 문제를 계속해서 답안을 보지 않고 스스로 풀어보고자 한다.

핵심이 되었던 연습 과정은 아래 두개 과정이다.
물론 이 구조가 이제 Java를 배우면서 더 깊게 변경 될 예정이다.
하지만 해당 카테고리 페이지는 
알고리즘 문제 해결을 하기 위한 연습이 주 목적이라서
기본적으로 내가 객체 인스턴스화를 통해 메서드 호출을 구분하면서 
"연산"에 집중 할 수 있는 나만의 틀로 활용하고자 한다.
 
https://ohnyong.tistory.com/177
 [Algorithm★] 4칙연산을 해주는 계산기 - 객체 지향 - 혼자 만들기+ChatGPT의 피드백 받기

https://ohnyong.tistory.com/178
 [Algorithm★] 4칙연산을 해주는 계산기 - 객체 지향 - 혼자 만들기+ChatGPT의 피드백 적용
주말이라 편하게 쉬었다. 운동도 오늘만큼은 쉬지만 밀린 집안일을 하고 세차도하느라 평소보다 더 많이 움직인듯 하다. 일부러 쿠팡으로 장보지 않고 트레이더스에 가서 맛있는것도 사먹고 행복한 주말이다. 그래도 저녁에 돌아와서 문제나 풀까 하면서 하나라도 해보려고 했다. 하루 정도는 푹 쉬는 패턴이 좋다~~
옷가게 포스기에서 볼법한 프로그램이다. 가격별로 할인이 적용되도록 구성해야 하는데, 처음에 input부분에서 모두 해결하려고 하니 복잡해서 다시한번 연산 메서드calculator(){}로 넘겨서 좀 더 편하게 작업 할 수 있었다. 단순히 출력하는 것보다 실제로 마트같은데서 사용하는 포스기가 이런 방식의 프로그램이 들어간건가 궁금하긴 하다.
 
 
1. 문제 파악 과정
 - 필요 데이터 파악
    +--- 데이터 타입 확인

 - 필요 메서드 파악
    +--- 기본 입력부 input(){} 
             +-- 입력 값 갯수 확인
             +-- 데이터 제한조건 파악(유효성검사 while loop)
    +--- 기본 계산부 calculate(){}
             +-- 필요 연산 확인
             +-- 필요 조건 확인
    +--- 기본 출력부 output(){}
             +-- 출력할 데이터, 내용 확인
    +--- 각 메서드 별 파라미터 전달 필요 부분 확인
 
2. 코드 작성 과정
 - Main.java 실행부 생성 , Solution.java 클래스(설계도) 생성

 - 클래스 member 구현
    +--- 필요 데이터 정리에 따라 변수 선언
    +--- 기본 생성자 선언
    +--- 필요 메서드 정리에 따른 메서드 선언
             +-- input(){}과 관련된 메서드부터 작성, 유효성 체크(진입부 메서드)
             +-- calculate(){}의 실제 연산 로직 작성
             +-- output(){}의 출력 관련 정리

 - 실행부 Main.java에서 객체 인스턴스 생성 및 객체로부터 진입부 메서드 호출

 


1. Main.java

이제 Main 부분은 객체 생성 호출 이외엔 남는게 없다.

package Algorithm11;

public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.inputPrice();
    }
}

 

2. Solution.java

연산은 특별히 어렵지 않았다. 나열된 조건에 실수만 하지 않으면 잘 작동한다. 작성해놓고 나니 좀 더 간략하게 작성하는 방법은 없을까? 처음에 input price를 할 때 조건은 아니었지만 첫째자리를 0으로 입력한다 했는데, 내가 이 부분을 컨트롤 하고 싶었는데 입력하는 값이 매번 다르고 substring으로 뭔가 하면 될 것 같았는데 실패했다. 이런 부분을 해결하는 함수가 분명히 있을 것 같은데 찾아봐야겠다.

package Algorithm11;

import java.util.Scanner;

public class Solution {
    //옷가게 할인 받기
    //문제 설명
    //int price 옷 가격 input scanner
    //int bill 결제 금액 outputBill(){}
    //머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
    //구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.
    //
    //제한사항
    //10 ≤ price ≤ 1,000,000
    //price는 10원 단위로(1의 자리가 0) 주어집니다.
    //소수점 이하를 버린 정수를 return합니다. Math
    double price;
    double discount5 = 0.95;
    double discount10 = 0.90;
    double discount20 = 0.80;
    String dcFlag;
    int bill;
    int dcDifferbill;
    Scanner sc = new Scanner(System.in);


    public Solution() {
        //기본성생저
    }

    void inputPrice() {
        while (true) {
            System.out.println("옷 가격을 입력해주세요.");
            //10 ≤ price ≤ 1,000,000
            price = sc.nextInt();
            if (price < 10 || price > 1000000) {
                System.out.println("금액은 10원~100만원 범위로 입력해주세요.");
                continue;
            }
            System.out.println(price);
            calculate(price);
            break;
        }
    }
    //price는 10원 단위로(1의 자리가 0) 주어집니다.
    //소수점 이하를 버린 정수를 return합니다. Math

    void calculate(double price) {
        if (price >= 100000 && price < 300000) {
            bill = (int)(discount5 * this.price);
            dcFlag = "5%";
            dcDifferbill = (int)this.price - bill;
        } else if (price >= 300000 && price < 500000) {
            bill = (int)(discount10 * this.price);
            dcFlag = "10%";
            dcDifferbill = (int)this.price - bill;
        } else if (price >= 500000) {
            bill = (int)(Math.floor(discount20 * this.price));
            dcFlag = "20%";
            dcDifferbill = (int)this.price - bill;
        }else{
            dcFlag = "0";
            bill = (int)price;
        }
        System.out.println(bill);
        outputBill(bill, dcFlag, dcDifferbill);
    }

    void outputBill(int bill, String dcFlag, int dcDifferbill) {
        if (dcFlag == "0"){
            System.out.printf("해당 상품은 추가 할인이 없으며 결제하실 금액은 %,d원 입니다.",bill);
        }else {
            System.out.printf("주문하신 상품은 %s할인이 적용되어\n할인 금액은 %,d원이며\n 결제하실 금액은 %,d입니다.", dcFlag,dcDifferbill,bill);
        }
    }
}