diff --git a/docs/README.md b/docs/README.md index e69de29..598b091 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,51 @@ +## 기능 요구 사항 +- [X] 입력 기능 + - [X] 자동차 이름 입력, 5자 이하의 이름, 쉼표','로 구분분 (ex:pobi,woni,jun) + - [X] 시도 횟수에 대한 입력, 양의 정수 + +- [X] 출력 기능 + - [X] 자동차 이름 입력 요구 문구 "경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)" + - [X] 시도 횟수 입력 요구 문구 "시도할 횟수는 몇 회인가요?" + - [X] 실행 결과를 이름 별로 출력 + - [X] 이름 입력 순서대로 결과 표시 + - [X] 이동 횟수만큼 '-' 출력하여 표현 + - [X] 시도 횟수 종료 시, 최종 우승자 안내 문구 "최종 우승자 : {이름}" + +- [X] 게임 실행 기능 + - [X] 이름별로 0~9 사이의 무작위 값 선택 + - [X] 값이 4 이상이면 이동 + - [X] 시도 횟수 종료 후, 이동 횟수가 가장 많은 자동차 이름이 최종 우승자 + -[X] 최종 우승자는 한 명 이상 (다수 가능) + +- [X] 예외 처리 및 종료 기능 + - [X] 사용자가 잘못된 값을 입력할 경우 ValueError를 발생 후 게임 종료 + - [X] 이름 입력 시 예외 사항 + - [X] 빈 이름일 경우 + - [X] 중복 값이 있는 경우 + - [X] 시도 횟수 입력 시 예외 사항 + - [X] 양의 정수가 아닌 경우 + +## 기능 추가 +1. name_input() +> 자동차 이름 입력 기능 함수 추가 +2. try_input() +> 시도 횟수를 입력 기능 함수 추가 +3. play_1set_of_game() +> 게임 실행 기능 함수 추가 +4. print_game_play_result() +> 시도 횟수만큼 반복하여 게임을 실행하고 매 시도마다 실행 결과 출력 기능 함수 추가 +5. check_winner() +> 시도 횟수 종류 후, 이동 횟수가 가장 많은 최종 우승자를 찾는 기능 함수 추가 +6. validate_input() +> 잘못된 값을 입력한 경우 ValueError가 발생하여 프로그램을 종료하는 기능 함수 추가 +7. is_number() +> 시도 횟수 입력 값이 int형인지 검증하는 기능 함수 추가 + +## 오류 수정 +1. is_number() 수정 +> str형 검증으로 작동하던 오류를 int형 검증으로 수정 +>> ~~str~~int(data) + +## 기능 수정 +1. validate_name() +> 이름 입력 값을 검증(이름 길이, null값, 중복) 기능을 validate_input()으로부터 함수 분리 \ No newline at end of file diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 4128547..be409b7 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,10 +1,96 @@ +import random + + +THRESHOLD = 4 # 성공 기준 값 +MAX_RANDOM_VALUE = 10 # 랜덤 숫자의 최대값 + + +def is_number(data): + """ + data가 숫자인지 확인하는 함수. + 숫자가 아니면 ValueError를 발생시킴. + """ + try: + return int(data) # data가 int 형식인지 확인 + except ValueError as e: + raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 + + +def validate_name(data): + for i in range(len(data)): + if len(data[i]) > 5: + raise ValueError("이름은 5자 이하만 가능합니다.") + elif len(data[i]) == 0: + raise ValueError("이름은 빈칸일 수 없습니다.") + elif data.count(data[i]) != 1: + raise ValueError("중복되는 이름이 있습니다.") + data[i] = [data[i], 0] + + +def validate_input(data): + if isinstance(data, int): + if data <= 0: + raise ValueError("시도할 횟수는 양의 정수이어야 합니다.") + elif isinstance(data, list): + validate_name(data) + + +def name_input(): + name_list = list(map(str, input().replace(" ", "").split(","))) + validate_input(name_list) + return name_list + + +def try_input(): + try_number = is_number(input()) + validate_input(try_number) + return try_number + + +def play_1set_of_game(data): + for i in range(len(data)): + value = random.randint(0, MAX_RANDOM_VALUE) + if value >= THRESHOLD: + data[i][1] += 1 + return data + + +def print_game_play_result(data, try_number): + for i in range(try_number): + data = play_1set_of_game(data) + for i in range(len(data)): + print("{0} : {1}".format(data[i][0], "-" * data[i][1])) + print() + return data + + +def check_winner(data): + win_list, winner_count = list(), 0 + for i in range(len(data)): + if data[i][1] > winner_count: + win_list, winner_count = [data[i][0]], data[i][1] + elif data[i][1] == winner_count: + win_list.append(data[i][0]) + return win_list + + def main(): """ 프로그램의 진입점 함수. 여기에서 전체 프로그램 로직을 시작합니다. """ # 프로그램의 메인 로직을 여기에 구현 - print("프로그램이 시작되었습니다.") + print("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)") + name_list = name_input() + + print("시도할 횟수는 몇 회인가요?") + try_number = try_input() + + print("\n실행 결과") + play_list = print_game_play_result(name_list, try_number) + + win_list = check_winner(play_list) + print("최종 우승자 : {0}".format(', '.join(win_list))) if __name__ == "__main__":