밀알

밀알

보통

소개

옛날에 한 왕자의 목숨을 구한 지혜로운 신하가 있었어요. 왕은 신하가 원하는 것이 무엇이든 주겠다고 약속했어요. 왕이 체스를 좋아한다는 것을 알고, 신하는 밀알을 갖고 싶다고 왕에게 말했어요. 체스판의 첫 번째 칸에는 한 알, 그다음 칸부터는 알의 수를 두 배씩 늘려서요.

지침

체스판에 놓인 밀알의 개수를 계산해요.

체스판은 64개의 칸으로 이루어져 있어요. 1번 칸에는 밀알이 한 개, 2번 칸에는 두 개, 3번 칸에는 네 개가 놓이고, 그다음부터는 칸마다 두 배씩 늘어나요.

다음을 계산하는 코드를 작성해 봐요:

  • 주어진 칸에 있는 밀알의 개수
  • 체스판 전체에 있는 밀알의 총 개수

정수의 최댓값

PHP 문서에 따르면 정수에는 최댓값이 있어요:

int의 크기는 플랫폼에 따라 달라요. 하지만 보통 최댓값은 약 20억이에요(부호 있는 32비트예요). 64비트 플랫폼은 보통 최댓값이 약 9E18이에요. PHP는 부호 없는 int를 지원하지 않아요.

다시 말해, PHP는 2^63 이상의 수를 정수로 표현할 수 없어요. 이 연습 문제의 일부 테스트는 64비트 정수(2^64)를 요구하는데, 이는 PHP의 정수 크기 제한을 넘어서요.

PHP는 수가 너무 커지면 int를 float로 자동 변환해요:

PHP가 int 타입의 범위를 벗어나는 수를 만나면, 대신 float로 해석해요. 또한, 연산 결과가 int 타입의 범위를 벗어나는 수가 되면 대신 float를 반환해요.

그런데 float 타입은 정밀도에 한계가 있어요. 그리고 왕은 부정확한 것을 싫어해요. 그래서 왕은 답을 int나 float로 표현하는 대신, 정숫값을 나타내는 문자열로 계산 결과를 받기로 했어요. 그리고 마지막에 대충 변환하는 게 아니라, 정수 연산을 원해요.

언어가 직접 허용하는 것보다 큰 수를 피해서 이 문제를 해결할 수 있을까요? 그리고 gmp나 bc 같은 다른 PHP 라이브러리도 사용하지 마세요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
PHP Exercism

밀알 문제를 시작해 볼 준비가 됐나요?

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