안녕하세요
우테코 프리코스 1주차 - 문제 1 본문
https://github.com/youngentry/javascript-onboarding/blob/main/docs/PROBLEM1.md
🚀 기능 요구 사항
포비와 크롱이 페이지 번호가 1부터 시작되는 400 페이지의 책을 주웠다. 책을 살펴보니 왼쪽 페이지는 홀수, 오른쪽 페이지는 짝수 번호이고 모든 페이지에는 번호가 적혀있었다. 책이 마음에 든 포비와 크롱은 페이지 번호 게임을 통해 게임에서 이긴 사람이 책을 갖기로 한다. 페이지 번호 게임의 규칙은 아래와 같다.
- 책을 임의로 펼친다.
- 왼쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
- 오른쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
- 2~3 과정에서 가장 큰 수를 본인의 점수로 한다.
- 점수를 비교해 가장 높은 사람이 게임의 승자가 된다.
- 시작 면이나 마지막 면이 나오도록 책을 펼치지 않는다.
포비와 크롱이 펼친 페이지가 들어있는 배열 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;
'우테코 프리코스 > 1주차' 카테고리의 다른 글
우테코 프리코스 1주차 - 문제 6 (리팩토링O) (0) | 2022.11.01 |
---|---|
우테코 프리코스 1주차 - 문제 5 (리팩토링O) (0) | 2022.10.29 |
우테코 프리코스 1주차 - 문제 4 (리팩토링O) (0) | 2022.10.29 |
우테코 프리코스 1주차 - 문제 3 (0) | 2022.10.29 |
우테코 프리코스 1주차 - 문제 2 (0) | 2022.10.27 |