트랙
/
PHP
PHP
/
연습 문제
/
피자 파이
피자 파이

피자 파이

학습 연습 문제

소개

정수

정수는 {..., -2, -1, 0, 1, 2, ...} 집합에 속하는 수예요. 정수의 최댓값과 최솟값은 PHP가 실행되는 시스템에 따라 결정돼요. 일반적으로 대부분의 현대 시스템에서 정수는 64비트 값이에요. 즉, -9_223_372_036_854_775_808부터 9_223_372_036_854_775_807까지 포함해 표현할 수 있어요.

<?php

$a = 1234;
$a = 1_234_567;

진법 접두사를 사용하면 10진법이 아닌 다른 진법으로 정수 리터럴 값을 작성할 수 있어요:

<?php

$a = 0123; // octal number (equivalent to 83 decimal)
$a = 0o123; // octal number (as of PHP 8.1.0)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)

PHP 문서에서 가져왔어요.

부동소수점 수

부동소수점 수는 PHP에서 실수의 부분집합을 표현하는 데 사용돼요. 부동소수점 수는 하나 이상의 숫자로 시작하고, 그 숫자들은 소수점 구분 기호로 나뉘어요.

<?php

$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
$d = 1_234.567; // as of PHP 7.4.0

흔히 하는 실수

부동소수점 수로는 모든 수와 산술 연산을 수행할 수 없어요. 달러와 센트를 표현할 때 부동소수점 수를 사용하면 반올림 오류가 발생할 수 있어요.

<?php

$result = 0.1 + 0.2; // => 0.30000000000000004

산술 연산자

PHP는 산술 연산을 수행하기 위한 여러 연산자를 제공해요. PHP의 산술 연산자는 표준 수학 연산 순서를 따라요. PHP가 제공하는 연산자는 다음과 같아요:

  • 항등 (+)
  • 부정 (-)
  • 덧셈 (+)
  • 뺄셈 (-)
  • 곱셈 (*)
  • 나눗셈 (/)
  • 나머지 (%)
  • 거듭제곱 (**)
$moles = +'10';
$aLotOfMoles = 6.022 * 10**23 * $moles;

지침

Lilly는 요리를 좋아해요. 친구들과 함께 피자 파티를 열고 싶어 하죠. 재료를 최대한 알차게 쓰려면, 시작하기 전에 각 재료가 얼마나 필요한지 알아야 해요.

이를 위해 Lilly는 계획의 일부를 자동화할 프로그램을 초안으로 작성했지만, 완성하는 데 도움이 필요해요. Lilly가 비율이 완벽한 피자 파티를 열 수 있도록 도와줄래요?

1. 반죽 비율

Lilly는 크러스트가 얇은, 바삭한 피자를 좋아해요. 가운데 부분에 필요한 반죽은 최소 200g이고, 나눠 먹을 사람이 한 명 늘 때마다 반죽이 20g씩 더 필요해요.

grams = pizzas * ((persons * 20) + 200)

Lilly에게는 다음과 같은 함수가 필요해요:

  • 피자 개수를 받고
  • 피자 한 판이 나눠 줄 사람 수를 받고
  • 필요한 반죽의 양을 가장 가까운 그램 단위로 반환해요.

예를 들어, 여덟 명이 먹을 피자 네 판을 만들려면:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateDoughRequirement(4, 8);
// => 1440

2. 소스 한 방울

Lilly는 소스를 바를 때 아주 꼼꼼하지만, 피자 크기는 들쭉날쭉할 수 있어요. 경험상 피자 한 판에 소스가 125mL 필요하다는 것을 알고 있죠. Lilly에게는 사야 할 소스 통의 개수를 계산하는 함수가 필요해요.

cans of sauce = pizzas * sauce per pizza / sauce can volume

예를 들어, 피자 여덟 판을 만들어야 하고 각 통이 250mL라면:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateSauceRequirement(8, 250);
// => 4

3. 치즈 주세요

치즈는 완벽한 정육면체 모양으로 나오고, 크기별로 판매해요.

Lily가 쓰는 공식은 피자의 넓이를 구하는 공식이 아니에요. 치즈가 피자 전체를 덮는 것을 원하지는 않기 때문이죠. 그래서 한 변의 길이가 cheese_dimension인 치즈 정육면체로 지름이 diameter인 피자를 몇 판 만들 수 있는지 구하기 위해 다음 공식을 쓰기로 했어요:

pizzas = (cheese_dimension³) / (thickness * PI * diameter)

다음과 같은 함수를 만들어 봐요:

  • 치즈 정육면체의 한 변의 길이를 받고
  • 치즈 층의 원하는 두께를 받고
  • 피자의 지름을 받고
  • Lilly의 공식을 사용해 만들 수 있는 피자 수를 내림해서 반환해요.

예를 들어, 25x25x25cm 치즈 정육면체와 0.5cm 두께의 치즈 층, 지름 30cm의 피자가 주어졌다면:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateCheeseCubeCoverage(25, 0.5, 30);
// => 331

4. 공평한 몫

마지막으로, Lilly는 피자를 각각 여덟 조각으로 나눠 친구들에게 똑같이 나눠 주고 싶어 해요.

다음과 같은 함수를 만들어 봐요:

  • 피자 개수와 친구 수를 받고
  • 각자 같은 수의 조각을 가져갈 때 남는 조각의 수를 반환해요.

예를 들어:

<?php

$pizza_pi = new PizzaPi();
$pizza_pi->calculateLeftOverSlices(2, 4);
// => 0
$pizza_pi->calculateLeftOverSlices(4, 3);
// => 2
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
PHP Exercism

피자 파이 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 PHP 트랙을 개념 11개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.