diff --git a/README.md b/README.md index b8af4ef..2c4947c 100644 --- a/README.md +++ b/README.md @@ -208,3 +208,4 @@ jun : ----- - **기능을 구현하기 전 `docs/README.md`에 구현할 기능 목록을 정리**해 추가합니다. - **Git의 커밋 단위는 앞 단계에서 `docs/README.md`에 정리한 기능 목록 단위**로 추가합니다. - [커밋 메시지 컨벤션](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 가이드를 참고하여 커밋 메시지를 작성합니다. + diff --git a/docs/README.md b/docs/README.md index e69de29..b3dc5d7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,22 @@ +## 구현할 기능 목록 +1. **자동차 이름 입력** + - 쉼표(`,`)로 구분된 자동차 이름을 입력 + - 각 이름은 5자 이하로 제한 -> 넘으면 ValueError + - 중복된 이름은 제거 + +2. **시도 횟수 입력** + - 사용자로부터 경주 시도 횟수를 입력 + - 입력값이 1 이상이어야 한다. -> 넘으면 ValueError + - 숫자가 아닌 값을 입력하면 -> ValueError + +3. **자동차 경주 진행** (move_cars 함수로 구현) + - 각 자동차는 무작위 숫자를 받아 4 이상이면 한 칸 이동 + - 이동 결과를 출력 + +4. **경주 상태 출력** (print_race 함수로 구현) + - 각 자동차의 현재 위치를 화면에 출력 + - 자동차 이름 오른쪽에 이동한 거리를 `-`로 표시 + +5. **우승자 결정** (get_winners 함수로 구현) + - 가장 멀리 이동한 자동차를 우승자로 선정 + - 여러 명이 동점일 경우, 공동 우승자로 처리 \ No newline at end of file diff --git a/src/racingcar/main.py b/src/racingcar/main.py index 4128547..0da1954 100644 --- a/src/racingcar/main.py +++ b/src/racingcar/main.py @@ -1,12 +1,188 @@ +<<<<<<< HEAD +"""자동차 경주 게임 메인 스크립트""" +======= +""" 자동차 경주 게임 메인 스크립트 """ +>>>>>>> a8f68ff7178f271a24793fe592b609c29719c4aa + +import random + + +<<<<<<< HEAD +# 상수 정의 +MOVE_THRESHOLD = 4 # 자동차가 전진할 최소 랜덤 값 +MIN_RAND = 1 # 랜덤 숫자의 최소값 +MAX_RAND = 9 # 랜덤 숫자의 최대값 +MAX_NAME_LENGTH = 5 # 자동차 이름 최대 길이 + + +def move_cars(car_positions): + """자동차 이동 로직 (랜덤 숫자가 MOVE_THRESHOLD 이상이면 이동)""" + + for name in car_positions: + if random.randint(MIN_RAND, MAX_RAND) >= MOVE_THRESHOLD: +======= +def move_cars(car_positions): + """자동차 이동 로직 (랜덤 숫자가 4 이상이면 이동)""" + + for name in car_positions: + if random.randint(1, 9) >= 4: +>>>>>>> a8f68ff7178f271a24793fe592b609c29719c4aa + car_positions[name] += 1 + + +def print_race(car_positions): + """현재 경주 상태 출력""" + + for name, pos in car_positions.items(): + if pos > 0: + print(f"{name} : {'-' * pos}") + else: + print(f"{name} : {' '.rstrip()}") # Trailing whitespace 제거 + print() + + +def get_winners(car_positions): + """최종 우승자 결정""" + + max_pos = max(car_positions.values()) +<<<<<<< HEAD + return [ + name for name, pos in car_positions.items() if pos == max_pos + ] # ✅ 긴 줄 개행 처리 +======= + return [name for name, pos in car_positions.items() if pos == max_pos] +>>>>>>> a8f68ff7178f271a24793fe592b609c29719c4aa + + def main(): - """ - 프로그램의 진입점 함수. - 여기에서 전체 프로그램 로직을 시작합니다. - """ - # 프로그램의 메인 로직을 여기에 구현 - print("프로그램이 시작되었습니다.") + """메인 함수""" + +<<<<<<< HEAD + car_names = input("경주할 자동차 이름을 입력하세요. (이름은 쉼표로 구분): ").split( + "," + ) # ✅ 긴 문자열 개행 처리 + + car_names = list( + dict.fromkeys(name.strip() for name in car_names if name.strip()) + ) # ✅ 중복 제거 및 공백 제거 (가독성 향상) + + for name in car_names: + if len(name) > MAX_NAME_LENGTH: + raise ValueError( + f"⚠ 자동차 이름은 {MAX_NAME_LENGTH}자 이하만 가능합니다!" + ) # ✅ 긴 문자열 개행 처리 + + try: + num_attempts = int(input("시도할 횟수는 몇 회인가요? ")) # 시도 횟수 입력 +======= + car_names = input("경주할 자동차 이름을 입력하세요." + "(이름은 쉼표로 구분): ").split(",") + car_names = list(dict.fromkeys( + name.strip() for name in car_names if name.strip() + )) # ✅ 올바른 들여쓰기 수정 + + for name in car_names: + if len(name) > 5: + raise ValueError("⚠ 자동차 이름은 5자 이하만 가능합니다!") + + try: + num_attempts = int(input("시도할 횟수는 몇 회인가요? ")) # 변수명 수정 +>>>>>>> a8f68ff7178f271a24793fe592b609c29719c4aa + if num_attempts <= 0: + raise ValueError("⚠ 시도 횟수는 1 이상이어야 합니다!") + except ValueError: + print("⚠ 잘못된 입력입니다. 숫자를 입력하세요.") + return + + car_positions = {name: 0 for name in car_names} # 자동차 위치 초기화 + +<<<<<<< HEAD + for _ in range(num_attempts): +======= + for _ in range(num_attempts): # 변수명 수정 +>>>>>>> a8f68ff7178f271a24793fe592b609c29719c4aa + move_cars(car_positions) # 자동차 이동 + print_race(car_positions) # 현재 상태 출력 + + winners = get_winners(car_positions) # 우승자 결정 + print(f"\n최종 우승자 : {', '.join(winners)}") + + +if __name__ == "__main__": + main() # ✅ 마지막 빈 줄 제거 (W391 해결) 현재 코드에서 """자동차 경주 게임 메인 스크립트""" + +import random + + +# 상수 정의 +MOVE_THRESHOLD = 4 # 자동차가 전진할 최소 랜덤 값 +MIN_RAND = 1 # 랜덤 숫자의 최소값 +MAX_RAND = 9 # 랜덤 숫자의 최대값 +MAX_NAME_LENGTH = 5 # 자동차 이름 최대 길이 + + +def move_cars(car_positions): + """자동차 이동 로직 (랜덤 숫자가 MOVE_THRESHOLD 이상이면 이동)""" + + for name in car_positions: + if random.randint(MIN_RAND, MAX_RAND) >= MOVE_THRESHOLD: + car_positions[name] += 1 + + +def print_race(car_positions): + """현재 경주 상태 출력""" + + for name, pos in car_positions.items(): + if pos > 0: + print(f"{name} : {'-' * pos}") + else: + print(f"{name} : {' '.rstrip()}") # Trailing whitespace 제거 + print() + + +def get_winners(car_positions): + """최종 우승자 결정""" + + max_pos = max(car_positions.values()) + return [ + name for name, pos in car_positions.items() if pos == max_pos + ] # ✅ 긴 줄 개행 처리 + + +def main(): + """메인 함수""" + + car_names = input("경주할 자동차 이름을 입력하세요. (이름은 쉼표로 구분): ").split( + "," + ) # ✅ 긴 문자열 개행 처리 + + car_names = list( + dict.fromkeys(name.strip() for name in car_names if name.strip()) + ) # ✅ 중복 제거 및 공백 제거 (가독성 향상) + + for name in car_names: + if len(name) > MAX_NAME_LENGTH: + raise ValueError( + f"⚠ 자동차 이름은 {MAX_NAME_LENGTH}자 이하만 가능합니다!" + ) # ✅ 긴 문자열 개행 처리 + + try: + num_attempts = int(input("시도할 횟수는 몇 회인가요? ")) # 시도 횟수 입력 + if num_attempts <= 0: + raise ValueError("⚠ 시도 횟수는 1 이상이어야 합니다!") + except ValueError: + print("⚠ 잘못된 입력입니다. 숫자를 입력하세요.") + return + + car_positions = {name: 0 for name in car_names} # 자동차 위치 초기화 + + for _ in range(num_attempts): + move_cars(car_positions) # 자동차 이동 + print_race(car_positions) # 현재 상태 출력 + + winners = get_winners(car_positions) # 우승자 결정 + print(f"\n최종 우승자 : {', '.join(winners)}") if __name__ == "__main__": - # 프로그램이 직접 실행될 때만 main() 함수를 호출 - main() + main() # ✅ 마지막 빈 줄 제거 (W391 해결) \ No newline at end of file diff --git a/tests/racingcar/test_main.py b/tests/racingcar/test_main.py index 2bb91be..4c4efcc 100644 --- a/tests/racingcar/test_main.py +++ b/tests/racingcar/test_main.py @@ -19,7 +19,7 @@ def test_전진_및_정지(capsys): main() # 프로그램 실행 # 출력값을 캡처한 후 검증 - 캡처된_출력 = capsys.readouterr() + 캡처된_출력 = capsys.readouterr().out assert all(예상_출력 in 캡처된_출력 for 예상_출력 in ["pobi : -", "woni : ", "최종 우승자 : pobi"]) diff --git a/tests/study/test_string.py b/tests/study/test_string.py index 2c36044..bf446a7 100644 --- a/tests/study/test_string.py +++ b/tests/study/test_string.py @@ -60,4 +60,4 @@ def test_charAt_메서드_위치_잘못된_경우_예외(): # 문자열 범위를 벗어나는 위치에 접근할 때 예외가 발생하는지 확인 with pytest.raises(IndexError, match="string index out of range"): - _ = input_str[5] + _ = input_str[5] \ No newline at end of file