🚀 기능 요구 사항
포비와 크롱이 페이지 번호가 1부터 시작되는 400 페이지의 책을 주웠다.
책을 살펴보니 왼쪽 페이지는 홀수, 오른쪽 페이지는 짝수 번호이고 모든 페이지에는 번호가 적혀있었다.
책이 마음에 든 포비와 크롱은 페이지 번호 게임을 통해 게임에서 이긴 사람이 책을 갖기로 한다.
페이지 번호 게임의 규칙은 아래와 같다.
1. 책을 임의로 펼친다.
2. 왼쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
3. 오른쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
4. 2~3 과정에서 가장 큰 수를 본인의 점수로 한다.
5. 점수를 비교해 가장 높은 사람이 게임의 승자가 된다.
6. 시작 면이나 마지막 면이 나오도록 책을 펼치지 않는다.
포비와 크롱이 펼친 페이지가 들어있는 배열 pobi와 crong이 주어질 때,
포비가 이긴다면 1, 크롱이 이긴다면 2, 무승부는 0, 예외사항은 -1로 return 하도록
solution 메서드를 완성하라.
제한사항
- pobi와 crong의 길이는 2이다.
- pobi와 crong에는 [왼쪽 페이지 번호, 오른쪽 페이지 번호]가 순서대로 들어있다.
실행 결과 예시
| pobi | crong | result |
| ---------- | ---------- | ------ |
| [97, 98] | [197, 198] | 0 |
| [131, 132] | [211, 212] | 1 |
| [99, 102] | [211, 212] | -1 |
우선 각자리의 뎃셈 혹은 곱셈을 구현해야 하는 만큼, 숫자로 받는 배열의 인덱스를 문자화하여 각각의 자릿수를 분리한 뒤 다시 숫자로 바꿔 덧셈 혹은 곱셈을 구현해봤다.
const getTopNum = (arr) => {
const array = arr.map(a => String(a));
const firstNum = array[1];
const [fir, sec, thi] = firstNum;
const [first, second, third] = [+fir, +sec, +thi];
}
각각의 자릿수인 숫자는 배열의 구조분해할당을 활용해 변수 선언했고, 단항 더하기 unary plus
를 사용해 숫자로 다시 바꿨다.
이제 인자로 받는 배열에서 큰 값을 구해야 하는데 두 배열이 모두 두 개의 인덱스만 갖고 있기 때문에 공통적인 함수 하나를 만들어 풀었다.
포비나 크롱의 배열이 연속되지 않을 경우 바로 -1을 리턴하기 위한 로직.
if (array[1] - array[0] !== 1) return -1;
이를 통해 예외 사항 발생 직후 -1이 리턴된다.
if (!second) return firstNum;
이 역시 변수로 선언해 둔 1번 인덱스에 해당하는 우측 페이지 값을 바로 리턴해주면 된다.
if (!third) {
const multiple = first * second;
const plus = first + second;
return multiple < plus ? plus : multiple;
}
두 수의 합과 곱을 비교해 둘 중 더 큰 값을 리턴하도록 했다.
if (third) {
const multiple = first * second * third;
const plus = first + second + third;
return multiple < plus ? plus : multiple;
}
세 수의 합과 곱을 비교해 둘 중 더 큰 값을 리턴하도록 했다.
여기서 아쉬웠던 점은, 두 자리 수와 세 자리 수일 경우에서 겹치는 로직이 존재하지만 그것을 재사용성이 좋게 만들지 못했다.
이제 미리 구성해 둔 로직에 포비와 크롱의 배열을 받아 어느 값이 더 크며 그에 적합한 리턴값을 배출하는 로직을 짰다.
function problem1(pobi, crong) {
const pobiNum = getTopNum(pobi);
const crongNum = getTopNum(crong);
return pobiNum === -1 || crongNum === -1
? -1
: pobiNum > crongNum
? 1
: pobiNum < crongNum
? 2
: pobiNum === crongNum
? 0
: undefined;
}