diff --git a/docs/README.md b/docs/README.md index e69de29..5417fd1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,29 @@ +# 자동차 경주 게임 + +## 기능 목록 + +1. **자동차 이름 입력** + - 사용자가가 쉼표(`,`)로 구분된 자동차 이름을 입력 + - 각 자동차 이름은 1~5자의 문자 + - 잘못된 입력일 경우 `ValueError`를 발생시키고 프로그램을 종료 + +2. **이동 횟수 입력** + - 사용자가 몇 번의 이동을 할 것인지 숫자로 입력 + - 1 이상의 정수를 입력해야 하며, 잘못된 입력 시 `ValueError` 발생 + +3. **자동차 이동 로직** + - 각 자동차는 매 턴마다 0~9 사이의 무작위 값을 얻음 + - 값이 4 이상이면 자동차는 한 칸(`-`) 전진 + - 값이 3 이하이면 그대로 멈춤 + +4. **경기 진행 및 결과 출력** + - 입력받은 횟수만큼 경기를 진행 + - 매 턴마다 각 자동차의 진행 상태를 출력 + +5. **우승자 선정** + - 가장 멀리 간 자동차가 우승자 + - 우승자가 여러 명일 경우 쉼표(`,`)로 구분하여 출력 + +6. **예외 처리** + - 잘못된 자동차 이름(1~5자 초과 또는 공백) 입력 시 `ValueError` 발생 + - 이동 횟수를 1 이상의 정수로 입력하지 않으면 `ValueError` 발생 \ No newline at end of file diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 4128547..24101ee 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,12 +1,72 @@ +import random + +# 자동차가 전진하는 기준값 +THRESHOLD = 4 +# 난수 생성 범위의 최대값 +RANDOM_MAX = 9 + + +def get_car_names(): + names = input("경주할 자동차 이름을 입력하세요. (이름은 쉼표로 구분)\n").split(",") + names = [name.strip() for name in names] + + if not names or any(len(name) > 5 or not name for name in names): + raise ValueError("자동차 이름은 1~5자의 문자여야 합니다.") + + return names + + +def get_attempt_count(): + try: + count = int(input("시도할 횟수는 몇 회인가요?\n")) + if count <= 0: + raise ValueError("시도 횟수는 양의 정수여야 합니다.") + return count + except ValueError as error: + if str(error) == "시도 횟수는 양의 정수여야 합니다.": + raise + raise ValueError("올바른 횟수를 입력하세요. (양의 정수)") from error + + +def move_car(): + if random.randint(0, RANDOM_MAX) >= THRESHOLD: + return "-" + return "" + + +def run_race(cars, attempts): + results = {car: "" for car in cars} + + print("\n실행 결과") + for _ in range(attempts): + for car in cars: + results[car] += move_car() + + for car, progress in results.items(): + print(f"{car} : {progress}") + print() + return results + + +def get_winners(results): + max_distance = max(len(progress) for progress in results.values()) + return [ + car for car, progress in results.items() + if len(progress) == max_distance + ] + + def main(): - """ - 프로그램의 진입점 함수. - 여기에서 전체 프로그램 로직을 시작합니다. - """ - # 프로그램의 메인 로직을 여기에 구현 - print("프로그램이 시작되었습니다.") + try: + cars = get_car_names() + attempts = get_attempt_count() + results = run_race(cars, attempts) + winners = get_winners(results) + print(f"최종 우승자 : {', '.join(winners)}") + except ValueError as error: + print(f"입력 오류: {error}") + raise if __name__ == "__main__": - # 프로그램이 직접 실행될 때만 main() 함수를 호출 main()