Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[자동차 경주] 김수진 미션 제출합니다. #438

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@
# javascript-racingcar-precourse

- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.

- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.

- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.

- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.

- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.

- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.

- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.

- 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시킨 후 애플리케이션은 종료되어야 한다.
70 changes: 69 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,73 @@
import { Console, MissionUtils } from "@woowacourse/mission-utils";

class App {
async run() {}
async run() {
// 문자열 길이 검증을 위한 함수
function isNameTooLong(name) {
return name.length > 5;
}
function validateCarArrayLength(arr) {
arr.forEach((name) => {
if (isNameTooLong(name)) {
throw Error(
"[ERROR] 자동차 이름은 최대 5글자까지 입력할 수 있습니다. 다시 입력해주세요."
);
}
});
}

const carStr = await Console.readLineAsync(
"경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)\n"
);
const carArr = carStr.split(",");
validateCarArrayLength(carArr);
const carObj = carArr.reduce((acc, name) => {
acc[name] = 0;
return acc;
}, {});
let tryCnt = await Console.readLineAsync("시도할 횟수는 몇 회인가요?");
tryCnt = parseInt(tryCnt) + 1;

Console.print("실행 결과");

// 자동차 위치 랜덤값에 맞게 업데이트
function updateCarPosition(car) {
const randomNum = MissionUtils.Random.pickNumberInRange(0, 9);
if (randomNum >= 4) {
carObj[car] += 1;
}
}

// 자동차 전진 상태 출력
function displayCarProgress(car) {
const progress = "-".repeat(carObj[car]);
Console.print(`${car} : ${progress}`);
}

// 경주 시작
function TryRace() {
carArr.forEach(updateCarPosition);
carArr.forEach(displayCarProgress);
}

// 우승자 찾기
function findWinner() {
const maxDistance = Math.max(...Object.values(carObj));
const winners = carArr.filter((car) => carObj[car] === maxDistance);
return winners.join(", ");
}

// 횟수 만큼 경주 진행
while ((tryCnt -= 1)) {
const carCnt = carArr.length;
TryRace();
Console.print("");
}

// 최종 우승자 출력
const winner = findWinner();
Console.print(`최종 우승자 : ${winner}`);
}
}

export default App;