From d940bdbc6b611aac768b0231f6f0bd04745f0627 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Mon, 10 Feb 2025 23:26:12 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20racingcar=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit racingcar 최초 모델 생성성 --- src/racingcar/main.py | 61 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 4128547..d833714 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,10 +1,69 @@ +import random + +def is_number (Data): + """ + Data가 숫자인지 확인하는 함수. + 숫자가 아니면 ValueError를 발생시킴. + """ + try: + str(Data) # Data가 int 형식인지 확인 + except ValueError as e: + raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 + +def validate_input(Data): + for i in range(len(Data)): + if len(Data[i]) > 5: + raise ValueError("이름은 5자 이하만 가능합니다.") + Data[i] = [Data[i], 0] + return Data + +def try_input(): + print("시도할 횟수는 몇 회인가요?") + n = input() + is_number(n) + return int(n) + +def play_1set_of_game(Data): + for i in range(len(Data)): + value = random.randint(0, 10) + if value >= 4: + Data[i][1] += 1 + 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 = validate_input(list(map(str, input().split(",")))) + n = try_input() + print() + print("실행 결과") + + for i in range(n): + name_list = play_1set_of_game(name_list) + for i in range(len(name_list)): + print("{0} : {1}".format(name_list[i][0], "-" * name_list[i][1])) + print() + + win_list = check_winner(name_list) + + print("최종 우승자 : {0}".format(', '.join(win_list))) + + + if __name__ == "__main__": From 677775021917cee97c2dac858ba7e0f70a8320e5 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Mon, 10 Feb 2025 23:39:02 +0900 Subject: [PATCH 02/16] =?UTF-8?q?style:=20trailing-whitespace=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 62번줄, 65번줄 trailing-whitespace --- src/racingcar/main.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index d833714..fccb0df 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -59,12 +59,8 @@ def main(): print() win_list = check_winner(name_list) - - print("최종 우승자 : {0}".format(', '.join(win_list))) - - - + print("최종 우승자 : {0}".format(', '.join(win_list))) if __name__ == "__main__": # 프로그램이 직접 실행될 때만 main() 함수를 호출 From 9fe05568900dfe1747bcae415f8026d01cb1c665 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Mon, 10 Feb 2025 23:44:52 +0900 Subject: [PATCH 03/16] =?UTF-8?q?style:=20PEP8=20Style=EB=A1=9C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PEP8 Style로 코드 변경 --- src/racingcar/main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index fccb0df..56d1891 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,5 +1,6 @@ import random + def is_number (Data): """ Data가 숫자인지 확인하는 함수. @@ -10,6 +11,7 @@ def is_number (Data): except ValueError as e: raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 + def validate_input(Data): for i in range(len(Data)): if len(Data[i]) > 5: @@ -17,12 +19,14 @@ def validate_input(Data): Data[i] = [Data[i], 0] return Data + def try_input(): print("시도할 횟수는 몇 회인가요?") n = input() is_number(n) return int(n) + def play_1set_of_game(Data): for i in range(len(Data)): value = random.randint(0, 10) @@ -30,6 +34,7 @@ def play_1set_of_game(Data): Data[i][1] += 1 return Data + def check_winner(Data): win_list, winner_count = list(), 0 for i in range(len(Data)): @@ -62,6 +67,7 @@ def main(): print("최종 우승자 : {0}".format(', '.join(win_list))) + if __name__ == "__main__": # 프로그램이 직접 실행될 때만 main() 함수를 호출 main() From 3f62a823e15eed556310f83fe5ed024b03a729af Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Mon, 10 Feb 2025 23:47:54 +0900 Subject: [PATCH 04/16] =?UTF-8?q?style:=20PEP8=20Style=EB=A1=9C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PEP8 Style로 코드 변경 --- src/racingcar/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 56d1891..6853b2f 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,7 +1,7 @@ import random -def is_number (Data): +def is_number(Data): """ Data가 숫자인지 확인하는 함수. 숫자가 아니면 ValueError를 발생시킴. From 861042a3d15494f0137830c9a25d3a2117d53b0c Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Tue, 11 Feb 2025 00:28:51 +0900 Subject: [PATCH 05/16] =?UTF-8?q?fix:=20is=5Fnumber()=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit int형인지 검사해야하지만, str형인지로 검사하는 오류 --- src/racingcar/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 6853b2f..44a9386 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -7,7 +7,7 @@ def is_number(Data): 숫자가 아니면 ValueError를 발생시킴. """ try: - str(Data) # Data가 int 형식인지 확인 + int(Data) # Data가 int 형식인지 확인 except ValueError as e: raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 From 03da6a47100069c85934b120269d5a61b9a2e29a Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 19:52:15 +0900 Subject: [PATCH 06/16] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임 실행 결과가 출력되는 기능을 main()으로부터 'print_game_play_result()'라는 함수로 분리 --- src/racingcar/main.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 44a9386..47898ab 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -45,6 +45,15 @@ def check_winner(Data): return win_list +def print_game_play_result(Data, n): + for i in range(n): + 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 main(): """ 프로그램의 진입점 함수. @@ -57,13 +66,7 @@ def main(): print() print("실행 결과") - for i in range(n): - name_list = play_1set_of_game(name_list) - for i in range(len(name_list)): - print("{0} : {1}".format(name_list[i][0], "-" * name_list[i][1])) - print() - - win_list = check_winner(name_list) + win_list = check_winner(print_game_play_result(name_list, n)) print("최종 우승자 : {0}".format(', '.join(win_list))) From d85918feec5ffd04206ad271b25d0ee642c8f6f8 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 19:57:20 +0900 Subject: [PATCH 07/16] refactor: Change parameter to lowercase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 대문자로 시작하는 파라미터를 소문자로 시작하도록 변경 --- src/racingcar/main.py | 48 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 47898ab..7e0a129 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,23 +1,23 @@ import random -def is_number(Data): +def is_number(data): """ - Data가 숫자인지 확인하는 함수. + data가 숫자인지 확인하는 함수. 숫자가 아니면 ValueError를 발생시킴. """ try: - int(Data) # Data가 int 형식인지 확인 + int(data) # data가 int 형식인지 확인 except ValueError as e: raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 -def validate_input(Data): - for i in range(len(Data)): - if len(Data[i]) > 5: +def validate_input(data): + for i in range(len(data)): + if len(data[i]) > 5: raise ValueError("이름은 5자 이하만 가능합니다.") - Data[i] = [Data[i], 0] - return Data + data[i] = [data[i], 0] + return data def try_input(): @@ -27,31 +27,31 @@ def try_input(): return int(n) -def play_1set_of_game(Data): - for i in range(len(Data)): +def play_1set_of_game(data): + for i in range(len(data)): value = random.randint(0, 10) if value >= 4: - Data[i][1] += 1 - return Data + data[i][1] += 1 + return data -def check_winner(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]) + 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 print_game_play_result(Data, n): +def print_game_play_result(data, n): for i in range(n): - Data = play_1set_of_game(Data) - for i in range(len(Data)): - print("{0} : {1}".format(Data[i][0], "-" * Data[i][1])) + 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 + return data def main(): @@ -73,4 +73,4 @@ def main(): if __name__ == "__main__": # 프로그램이 직접 실행될 때만 main() 함수를 호출 - main() + main() \ No newline at end of file From 0965297c900152bbbe95f96e5806f6ef156c0c5f Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 20:07:03 +0900 Subject: [PATCH 08/16] fix: Add validation for empty names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 빈 이름에 대한 검증 추가 중복되는 이름에 대한 검증 추가가 --- src/racingcar/main.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 7e0a129..287962d 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -16,6 +16,10 @@ def validate_input(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] return data @@ -61,7 +65,7 @@ def main(): """ # 프로그램의 메인 로직을 여기에 구현 print("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)") - name_list = validate_input(list(map(str, input().split(",")))) + name_list = validate_input(list(map(str, input().replace(" ","").split(",")))) n = try_input() print() print("실행 결과") From 512687654858e4664c61cc20c80690f11074f666 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 20:09:47 +0900 Subject: [PATCH 09/16] refactor: Write variable names more clearly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변수명을 더 정확히 작성 (n -> try_number) --- src/racingcar/main.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 287962d..ba7ec08 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -26,9 +26,9 @@ def validate_input(data): def try_input(): print("시도할 횟수는 몇 회인가요?") - n = input() - is_number(n) - return int(n) + try_count = input() + is_number(try_count) + return int(try_count) def play_1set_of_game(data): @@ -49,8 +49,8 @@ def check_winner(data): return win_list -def print_game_play_result(data, n): - for i in range(n): +def print_game_play_result(data, try_count): + for i in range(try_count): data = play_1set_of_game(data) for i in range(len(data)): print("{0} : {1}".format(data[i][0], "-" * data[i][1])) @@ -66,11 +66,11 @@ def main(): # 프로그램의 메인 로직을 여기에 구현 print("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)") name_list = validate_input(list(map(str, input().replace(" ","").split(",")))) - n = try_input() + try_count = try_input() print() print("실행 결과") - win_list = check_winner(print_game_play_result(name_list, n)) + win_list = check_winner(print_game_play_result(name_list, try_count)) print("최종 우승자 : {0}".format(', '.join(win_list))) From 094c44047ba27fe6eaa611eec7261a1a02141cb6 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 20:10:55 +0900 Subject: [PATCH 10/16] refactor: Write variable names more clearly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 변수명을 더 정확히 작성 (n -> try_number) --- src/racingcar/main.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index ba7ec08..5adbc5b 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -26,9 +26,9 @@ def validate_input(data): def try_input(): print("시도할 횟수는 몇 회인가요?") - try_count = input() - is_number(try_count) - return int(try_count) + try_number = input() + is_number(try_number) + return int(try_number) def play_1set_of_game(data): @@ -49,8 +49,8 @@ def check_winner(data): return win_list -def print_game_play_result(data, try_count): - for i in range(try_count): +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])) @@ -66,11 +66,11 @@ def main(): # 프로그램의 메인 로직을 여기에 구현 print("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)") name_list = validate_input(list(map(str, input().replace(" ","").split(",")))) - try_count = try_input() + try_number = try_input() print() print("실행 결과") - win_list = check_winner(print_game_play_result(name_list, try_count)) + win_list = check_winner(print_game_play_result(name_list, try_number)) print("최종 우승자 : {0}".format(', '.join(win_list))) From 67c5fa06e280cd2a3b2492cf8e0b0d3b6ce8e28a Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 20:23:30 +0900 Subject: [PATCH 11/16] fix: Add validation for number of attempts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 시도 횟수에 대한 검증 추가 (양의 정수가 아니면 ValueError 발생) --- src/racingcar/main.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 5adbc5b..adc23b2 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -11,8 +11,7 @@ def is_number(data): except ValueError as e: raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 - -def validate_input(data): +def validate_name(data): for i in range(len(data)): if len(data[i]) > 5: raise ValueError("이름은 5자 이하만 가능합니다.") @@ -21,13 +20,21 @@ def validate_input(data): elif data.count(data[i]) != 1: raise ValueError("중복되는 이름이 있습니다.") data[i] = [data[i], 0] + +def validate_input(data): + if isinstance(data, str): + is_number(data) + if int(data) <= 0: + raise ValueError("시도할 횟수는 양의 정수이어야 합니다.") + elif isinstance(data, list): + validate_name(data) return data def try_input(): print("시도할 횟수는 몇 회인가요?") try_number = input() - is_number(try_number) + validate_input(try_number) return int(try_number) From e82f4d55391810fd59134061c71fc2b4335fd69e Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 20:29:46 +0900 Subject: [PATCH 12/16] refactor: Change to magic number constant & PEP8 Style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숫자 상수를 매직넘버 상수로 바꾸고, 전방선언 PEP8 Style로 코드 변경 --- src/racingcar/main.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index adc23b2..8ae669f 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,6 +1,10 @@ import random +THRESHOLD = 4 # 성공 기준 값 +MAX_RANDOM_VALUE = 10 # 랜덤 숫자의 최대값 + + def is_number(data): """ data가 숫자인지 확인하는 함수. @@ -11,6 +15,7 @@ def is_number(data): except ValueError as e: raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 + def validate_name(data): for i in range(len(data)): if len(data[i]) > 5: @@ -21,6 +26,7 @@ def validate_name(data): raise ValueError("중복되는 이름이 있습니다.") data[i] = [data[i], 0] + def validate_input(data): if isinstance(data, str): is_number(data) @@ -40,8 +46,8 @@ def try_input(): def play_1set_of_game(data): for i in range(len(data)): - value = random.randint(0, 10) - if value >= 4: + value = random.randint(0, MAX_RANDOM_VALUE) + if value >= THRESHOLD: data[i][1] += 1 return data From 57d31a6ab2c84c6a3539564e3c65d4f365b82dbb Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Wed, 12 Feb 2025 20:35:42 +0900 Subject: [PATCH 13/16] refactor: Change to PEP8 Style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 아래 스타일 오류 수정 src/racingcar/main.py:81:65: E231 missing whitespace after ',' src/racingcar/main.py:81:80: E501 line too long (82 > 79 characters) src/racingcar/main.py:93:11: W292 no newline at end of file --- src/racingcar/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 8ae669f..4d5873b 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -78,7 +78,8 @@ def main(): """ # 프로그램의 메인 로직을 여기에 구현 print("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)") - name_list = validate_input(list(map(str, input().replace(" ","").split(",")))) + get_name = input().replace(" ", "").split(",") + name_list = validate_input(list(map(str, get_name))) try_number = try_input() print() print("실행 결과") @@ -90,4 +91,4 @@ def main(): if __name__ == "__main__": # 프로그램이 직접 실행될 때만 main() 함수를 호출 - main() \ No newline at end of file + main() From 54e5d1709abc65825e35a16891406b40327af333 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Thu, 13 Feb 2025 13:01:57 +0900 Subject: [PATCH 14/16] refactor: Change the validation method for entering of attempts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 시도 횟수 입력에 대한 검증 방법 변경 validate_input()에 instance를 str로 가져온 다음 is_number()로 검증 후 양의 정수인지 확인하는 방법 -> try_input()에서 is_number()로 검증 후 validate_input()에 instance를 int형으로 보내어 코드 가독성을 높임 --- src/racingcar/main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 4d5873b..9d1931a 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -11,7 +11,7 @@ def is_number(data): 숫자가 아니면 ValueError를 발생시킴. """ try: - int(data) # data가 int 형식인지 확인 + return int(data) # data가 int 형식인지 확인 except ValueError as e: raise ValueError("숫자만 입력해주세요.") from e # 숫자가 아닌 값 입력시 예외 처리 @@ -28,9 +28,8 @@ def validate_name(data): def validate_input(data): - if isinstance(data, str): - is_number(data) - if int(data) <= 0: + if isinstance(data, int): + if data <= 0: raise ValueError("시도할 횟수는 양의 정수이어야 합니다.") elif isinstance(data, list): validate_name(data) @@ -40,8 +39,9 @@ def validate_input(data): def try_input(): print("시도할 횟수는 몇 회인가요?") try_number = input() + try_number = is_number(try_number) validate_input(try_number) - return int(try_number) + return try_number def play_1set_of_game(data): From 7d5ff05ea3642f8af229d57c61adc5da8e712383 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Thu, 13 Feb 2025 13:17:11 +0900 Subject: [PATCH 15/16] refactor: Separater car name input function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 자동차 이름을 입력받는 함수를 분리 전체적인 코드 가독성 높임 --- src/racingcar/main.py | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 9d1931a..be409b7 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -33,13 +33,16 @@ def validate_input(data): raise ValueError("시도할 횟수는 양의 정수이어야 합니다.") elif isinstance(data, list): validate_name(data) - return data + + +def name_input(): + name_list = list(map(str, input().replace(" ", "").split(","))) + validate_input(name_list) + return name_list def try_input(): - print("시도할 횟수는 몇 회인가요?") - try_number = input() - try_number = is_number(try_number) + try_number = is_number(input()) validate_input(try_number) return try_number @@ -52,6 +55,15 @@ def play_1set_of_game(data): 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)): @@ -62,15 +74,6 @@ def check_winner(data): return win_list -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 main(): """ 프로그램의 진입점 함수. @@ -78,14 +81,15 @@ def main(): """ # 프로그램의 메인 로직을 여기에 구현 print("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)") - get_name = input().replace(" ", "").split(",") - name_list = validate_input(list(map(str, get_name))) + name_list = name_input() + + print("시도할 횟수는 몇 회인가요?") try_number = try_input() - print() - print("실행 결과") - win_list = check_winner(print_game_play_result(name_list, try_number)) + print("\n실행 결과") + play_list = print_game_play_result(name_list, try_number) + win_list = check_winner(play_list) print("최종 우승자 : {0}".format(', '.join(win_list))) From 48ac5492d13d7fb0aa3e456e09d6f5e39a838647 Mon Sep 17 00:00:00 2001 From: AI-WonYJ Date: Thu, 13 Feb 2025 13:29:56 +0900 Subject: [PATCH 16/16] docs: Write functional documentation --- docs/README.md | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) 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