wisePocket

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

Java & Algorithm/Algorithm Practice

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

ohnyong 2023. 8. 2. 16:46

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

 

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

이번 부분에서는 실수를 다루는 것으로 확장되었다. 연산 부분은 문제만 보고있으면 어려워 보이지만 구조를 먼저 정하고, 연산 부분만 집중해서 실제 예시를 하나씩 적어 나가면 풀어나갈 방법이 보였다. 실수를 올리는 부분 RoundUp이런 것이 생각났는데 정확히 생각이 안났다. 그래서 ChatGPT를 통해서 뭐였는지, 구현 방법에 대해서 설명을 보고 따라 할 수 있었다. 마찬가지로 오류가 발생했는데 원인은 내가 printf에서 출력할 부분에 대해서 착각을 해서 중복된 코드가 있었기 때문이었다.
 
1. 문제 파악 과정
 - 필요 데이터 파악
    +--- 데이터 타입 확인

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

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

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

 


1. Main.java

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

package Algorithm07;

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

 

 

2. Solution.java

연산 부분을 천천히 생각하면서 풀어냈다. 특히 1판에서 2판으로 변하는 부분이 포인트이므로 규칙을 찾아내야 한다. 물론 다른 방식으로도 풀어낼 수 있지만 나한테 당장 생각나는 흐름으로 선택했다. 이보다 더 좋은 방식도 있을 것 같다.

package Algorithm07;

import java.util.Scanner;

public class Solution {
    /*문제 설명
머쓱이네 피자가게는
 피자를 일곱 조각으로 잘라 줍니다. pizzaNum=1 -> pieceNum = 7 , 2->14, ...
  피자를 나눠먹을 사람의 수 n이 주어질 때, inputMemberNum(){}
   모든 사람이 피자를 한 조각 이상 먹기 위해 memberPizza >= 1  , calculate(){}
    필요한 피자의 수를 return 하는 solution 함수를 완성해보세요. outputPizzaNum(){}

제한사항
1 ≤ memberNum ≤ 100
    */
    double pizzaNum;//피자개수
    int pieceNum;//조각개수
    int memberNum;//인원수
    int orderNum;//주문필요피자개수
    Scanner sc = new Scanner(System.in);

    public Solution() {

    }

    void inputMemberNum() {
        System.out.println("피자를 나눠 드실 인원수를 말씀해주세요.\n저희 가게는 7조각으로 나눠드려요.\n");
        while (true) {
            memberNum = sc.nextInt();
            if (memberNum < 1 || memberNum > 100) {
                System.out.println("인원 수는 1~100명으로 입력해주세요.");
                continue;
            }
            calcultate(memberNum);
            break;
        }
    }

    void calcultate(int memberNum) {
        /*5명일때 1개면 7조각이니 가능
         * 7명일땐 딱 맞음
         * 8명일땐 1조각이 부족해서 피자 2개가 되야함(14피스가되고)
         * 그럼 1~7명 8~14명 15~21명 으로 된다는것이면
         * pizza 수는 7의 배수와 관계가 있음
         * memberNum가 6 7 8 9 10 11 12 13 14이 입력 되었을 때,
         * 7로 나눈몫  0.85 / 1 / 1.14 / 1.28 / ...     1.85 / 2.0 이 되는데,
         * 피자 수는 그럼 소수점 올림 처리해버리면 된다.
         * ex1)6명이면 0.85면 올림으로 1로 올라가면서 피자 1개면 된다는것이고
         * ex2)8명이면 1.14인데 올림으로 2가되면서 피자 2개면 된다는 것
         * 그럼 나에게 필요한 것은 pizzaNum은 실수(소수점) 를 받을 준비가 되어야 한다. => double 바꿔야할까?
         * 실수를 올림 처리할 메서드가 필요하다. Math.ceil() 써보자. 여기서 바로 int로 형변환해서 할당해도 된다. */
        pieceNum = 7;
        pizzaNum = Math.ceil((double) memberNum / pieceNum);
        outputPizzaNum((int) pizzaNum);
    }

    void outputPizzaNum(int pizzaNum) {

        System.out.println(memberNum);
        System.out.printf("%d분이 나눠 드시려면 피자를 %d판 시키셔야 할 듯합니다.", memberNum, pizzaNum);
    }
}