wisePocket

[Algorithm] 원하는 피자 등분, 입력한 인원에 따른 필요한 피자판 수를 구하는 계산기 만들기2 본문

Java & Algorithm/Algorithm Practice

[Algorithm] 원하는 피자 등분, 입력한 인원에 따른 필요한 피자판 수를 구하는 계산기 만들기2

ohnyong 2023. 8. 2. 19:29

원하는 피자 등분, 입력한 인원에 따른 필요한 피자판 수를 구하는 계산기 만들기2

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

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

https://ohnyong.tistory.com/178
 [Algorithm★] 4칙연산을 해주는 계산기 - 객체 지향 - 혼자 만들기+ChatGPT의 피드백 적용
이번 부분에서는 저번 문제와 비슷하지만 피자를 몇등분으로 나눌지 물어보는 것이 추가된다. 겉으로 보기엔 복잡해보여도, 비지니스 로직을 먼저 생각해서 그에 대한 메서드를 구성하고, 예시를 통해서 규칙을 찾아내는 것이 쉽게 접근하는 방법이었다.
 
 
1. 문제 파악 과정
 - 필요 데이터 파악
    +--- 데이터 타입 확인

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

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

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

 


1. Main.java

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

package Algorithm08;

import Algorithm08.Solution;

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

 

 

2. Solution.java

연산 부분을 천천히 생각하면서 풀어냈다. 특히 1판에서 2판으로 변하는 부분이 포인트이므로 규칙을 찾아내야 한다.
문제를 쳐다만 보고 있으면 햇갈릴 수 있다. 우선 비지니스 로직을 생각하고 메서드부터 구분 지었다. 실제로 내가 구해야 되는(연산) 부분만 구분하기 위해서 이 같은 코딩 방법이 보기 편한 것 같다.

우선 종업원과 손님의 입장으로 생각한다.
1. 피자를 몇등분 묻고(인풋요청) -> 손님은 답한다(인풋1)
2. 사람은 몇명인지 묻고(인풋요청) -> 손님은 답한다(인풋2)
3. 종업원은 필요한 피자 판수를 계산한다(연산로직)
4. 종업원은 인원 전원이 1조각 이상 먹을 수 있는 판수를 얘기해준다(아웃풋)

package Algorithm08;

import java.util.Scanner;

public class Solution {
    /*문제 설명
머쓱이네 피자가게는
피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. pizza 1 -> piece 2~10
 피자 조각 수 slice(piece)와 piece -> how many slices do you want to cut it. inputPizzaCutAsk(){}
  피자를 먹는 사람의 수 n이 memberNum , how many people? inputMemberAsk(){}
   매개변수로 주어질 때,
   n명의 사람이 최소 한 조각 이상 피자를 먹으려면 memberNum
    최소 몇 판의 피자를 시켜야 하는지 orderPizzaNum
    를 return 하도록 solution 함수를 완성해보세요.

   비지니스 로직정리
   피자를 몇등분 해드릴까요? -> 몇명이서 드시나요? -> 그럼 몇판 시키셔야 합니다.

제한사항
2 ≤ slice ≤ 10
1 ≤ n ≤ 100*/
    double pizzaNum;
    int pieceNum;
    int memberNum;
    Scanner sc = new Scanner(System.in);

    public Solution() {

    }

    void inputPizzaCutAsk() {
        System.out.println("피자를 몇등분 해드릴까요?");
        pieceNum = sc.nextInt();
        while (true) {
            if (pieceNum > 2 && pieceNum > 10) {
                System.out.println("피자는 2~10조각까지만 커팅해드릴 수 있어요.");
                continue;
            }
            break;
        }
        inputMemberAsk();
        calculate(pieceNum, memberNum);

    }
    void inputMemberAsk() {
        System.out.println("몇명이서 드실건가요?");
        memberNum = sc.nextInt();
        while (true) {
            if (memberNum < 1 && memberNum > 100) {
                System.out.println("인원은 1~100명으로만 입력해주세요.");
                continue;
            }
            break;
        }
    }

    void calculate(int pieceNum, int memberNum) {
    //    5조각을 해주세요, 3명입니다. == 피자 1개로 가능
    //    5*1 > 3
    //    piece*pizza >member
    //    member/piece < pizza
    //    3/5(==0.6) => 1
    //    5조각을 해주세요, 6명입니다. == 피자 2개 필요
    //    6/5(==1.2) => 2
    //    9조각을 해주세요 14명입니다.
    //    14/9 == 1.55.. 올림 =>2
        pizzaNum = Math.ceil((double)memberNum/pieceNum); //member는 int니 double형변환
        outputOrder((int)pizzaNum);//pizzaNum은 double이니 int로 형변환

    }

    void outputOrder(int pizzaNum) {
        System.out.printf("%d명이 드시려면 %d판을 시키셔야 합니다.", memberNum, pizzaNum);
    }

}