안녕하세요

우테코 프리코스 1주차 - 문제 1 본문

우테코 프리코스/1주차

우테코 프리코스 1주차 - 문제 1

sakuraop 2022. 10. 27. 23:03

https://github.com/youngentry/javascript-onboarding/blob/main/docs/PROBLEM1.md

 

🚀 기능 요구 사항

포비와 크롱이 페이지 번호가 1부터 시작되는 400 페이지의 책을 주웠다. 책을 살펴보니 왼쪽 페이지는 홀수, 오른쪽 페이지는 짝수 번호이고 모든 페이지에는 번호가 적혀있었다. 책이 마음에 든 포비와 크롱은 페이지 번호 게임을 통해 게임에서 이긴 사람이 책을 갖기로 한다. 페이지 번호 게임의 규칙은 아래와 같다.

  1. 책을 임의로 펼친다.
  2. 왼쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
  3. 오른쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
  4. 2~3 과정에서 가장 큰 수를 본인의 점수로 한다.
  5. 점수를 비교해 가장 높은 사람이 게임의 승자가 된다.
  6. 시작 면이나 마지막 면이 나오도록 책을 펼치지 않는다.

포비와 크롱이 펼친 페이지가 들어있는 배열 pobi와 crong이 주어질 때, 포비가 이긴다면 1, 크롱이 이긴다면 2, 무승부는 0, 예외사항은 -1로 return 하도록 solution 메서드를 완성하라.

제한사항

  • pobi와 crong의 길이는 2이다.
  • pobi와 crong에는 [왼쪽 페이지 번호, 오른쪽 페이지 번호]가 순서대로 들어있다.

실행 결과 예시

pobicrongresult

[97, 98] [197, 198] 0
[131, 132] [211, 212] 1
[99, 102] [211, 212] -1

 


 

신경 쓴 점

  • 각 기능 요구 사항을 수행하는 함수를 가능한 작게 만들려고 노력했습니다.
  • 주석을 남겨 코드의 이해를 돕습니다.

 

아쉬운 점

  • 예외사항 코드를 간결하게 구현하지 못했습니다.
  • 입력 받은 값을 변수에 저장하는 과정에서
    isArray를 이용하여 배열인지 확인하여야 하는 과정이 생략될 수 있을 것 같지만 방법을 모르겠습니다.

 


 

function problem1(pobi, crong) {
    // 1 : 책을 임의로 펼친다. >>> 페이지 숫자를 입력받습니다.
    [pobiL, pobiR, crongL, crongR] = [undefined, undefined, undefined, undefined];
    if (Array.isArray(pobi)) {
        [pobiL, pobiR, crongL, crongR] = [pobi[0], pobi[1], crong[0], crong[1]];
    }

    // 6. 예외사항을 추가합니다.
    // 6-(1) 모든 수는 2~399 페이지 사이의 수여야 합니다.
    if (pobiL <= 1 || pobiR <= 1 || crongL <= 1 || crongR <= 1) {
        return -1;
    }
    if (pobiL >= 400 || pobiR >= 400 || crongL >= 400 || crongR >= 400) {
        return -1;
    }
    // 6-(2) [오른쪽 페이지] - [왼쪽 페이지]의 값은 1 이어야 합니다.
    if (pobiR - pobiL !== 1 || crongR - crongL !== 1) {
        return -1;
    }

    // 2-1, 3-1 : 각 자리 숫자를 모두 더하는 함수를 만듭니다.
    const sum = (n) => {
        let sumIs = 0;
        while (n > 0) {
            sumIs += n % 10;
            n = parseInt(n / 10);
        }
        return sumIs;
    };

    // 2-2, 3-2 : 각 자리 숫자를 모두 곱하는 함수를 만듭니다.
    const multiply = (n) => {
        let multiplyIs = 1;
        while (n > 0) {
            multiplyIs *= n % 10;
            n = parseInt(n / 10);
        }
        return multiplyIs;
    };

    // 4-1. 가장 큰 수를 본인의 점수로 만드는 함수를 만듭니다.
    const getBigNum = (nameL, nameR) => {
        return Math.max(sum(nameL), sum(nameR), multiply(nameL), multiply(nameR));
    };

    // 4-2. 본인의 점수를 구합니다.
    const pobiNum = getBigNum(pobiL, pobiR);
    const crongNum = getBigNum(crongL, crongR);

    // 5.요구사항에 따라서 게임의 승자를 구합니다.
    // pobi 승리
    if (pobiNum > crongNum) {
        return 1;
    }
    // crong 승리
    if (pobiNum < crongNum) {
        return 2;
    }
    // 무승부
    if (pobiNum === crongNum) {
        return 0;
    }
}

problem1();

module.exports = problem1;