Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#### 조건
>들여쓰기 깊이 2까지만 허용
>함수나 메서드가 한 가지 일만 하도록 최대한 작게 만들기
>입력이 올바르지 않은 경우 ValueError

#### 기본 입출력
* [x] 자동차 이름과 시도 횟수 입력받기
(단, 이름은 5자 이하, 쉼표로 구분)
* [x] 실행 결과 (전진 횟수 * '-' 사용)

#### 전진 여부 함수
* [x] 0~9 사이 무작위 값
* [x] 그 값이 4 이상이면 전진

#### 최종 우승자 출력
* [x] 전진 최대값 구하기
* [x] 자동차 전진값 == 최대값인 경우 winner 리스트에 추가
* [x] 형식에 맞추어 출력
65 changes: 62 additions & 3 deletions src/racingcar/main.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,70 @@
""" 자동차 경주 게임 """

import random
FORWARD_THRESHOLD = 4


def main():
"""
프로그램의 진입점 함수.
여기에서 전체 프로그램 로직을 시작합니다.
프로그램을 실행하고, 자동차 경주의 시뮬레이션을 수행하는 함수
사용자로부터 자동차 이름과 시도 횟수를 입력받고,
각 시도마다 경주를 진행하여 최종 우승자를 출력.
"""
# 프로그램의 메인 로직을 여기에 구현
print("프로그램이 시작되었습니다.")

car_names = input("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)\n")
cars = car_names.split(",")
if not all(car.strip() for car in cars):
raise ValueError("자동차 이름은 빈 문자열이 될 수 없습니다.")
if len(cars) != len(set(cars)):
raise ValueError("중복된 이름은 허용되지 않습니다.")
for car in cars:
if len(car) > 5:
raise ValueError("이름이 5자를 초과합니다.")

car_positions = {car: 0 for car in cars}

attempts = input("시도할 횟수는 몇 회인가요?\n")
if not attempts.isdigit():
raise ValueError("시도 횟수는 숫자로 입력하세요.")
attempts = int(attempts)
if attempts <= 0:
raise ValueError("시도 횟수는 1 이상이어야 합니다.")

print("\n실행 결과")
for _ in range(attempts):
movement(cars, car_positions)
for car in cars:
print(car + " : " + '-' * car_positions[car])
print()
print_winner(cars, car_positions)


def movement(cars, car_positions):
"""
각 자동차가 0에서 9 사이의 랜덤 숫자를 생성하여,
4 이상의 숫자가 나오면 해당 자동차의 위치를 1 증가시키는 함수
"""
for car in cars:
if random.randint(0, 9) >= FORWARD_THRESHOLD:
car_positions[car] += 1


def get_winner(cars, car_positions):
"""
경주에서 우승한 자동차를 구하는 함수
"""
max_value = max(car_positions.values())
return [car for car in cars if car_positions[car] == max_value]


def print_winner(cars, car_positions):
"""
최종 우승자를 출력하는 함수
"""
winner = get_winner(cars, car_positions)
print(f"최종 우승자 : {', '.join(winner)}")


if __name__ == "__main__":
# 프로그램이 직접 실행될 때만 main() 함수를 호출
Expand Down
50 changes: 48 additions & 2 deletions tests/racingcar/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def test_전진_및_정지(capsys):
main() # 프로그램 실행

# 출력값을 캡처한 후 검증
캡처된_출력 = capsys.readouterr()
캡처된_출력 = capsys.readouterr().out
assert all(예상_출력 in 캡처된_출력 for 예상_출력 in ["pobi : -", "woni : ", "최종 우승자 : pobi"])


Expand All @@ -34,5 +34,51 @@ def test_이름에_대한_예외():
with patch('builtins.input', side_effect=["pobi,javaji", "1"]):
main() # 프로그램 실행


# 추가적인 시나리오에 대한 테스트를 필요에 따라 작성할 수 있습니다.

# 잘못된 시도 횟수에 대한 예외 처리 테스트
def test_시도_횟수에_대한_예외():
"""
시도 횟수에 대한 예외 처리를 테스트합니다.
'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다.
"""
with pytest.raises(ValueError):
# 시도 횟수가 0인 경우에 대한 입력을 모의 처리
with patch('builtins.input', side_effect=["pobi,won", "0"]):
main() # 프로그램 실행


# 이름의 중복에 대한 예외 처리 테스트
def test_이름_중복에_대한_예외():
"""
이름 중복에 대한 예외 처리를 테스트합니다.
'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다.
"""
with pytest.raises(ValueError):
# 자동차 이름이 중복된 경우에 대한 입력을 모의 처리
with patch('builtins.input', side_effect=["pobi,won,pobi", "1"]):
main() # 프로그램 실행


# 빈 이름에 대한 예외 처리 테스트
def test_자동차_이름이_빈_경우에_대한_예외():
"""
자동차 이름이 빈 경우에 대한 예외 처리를 테스트합니다.
'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다.
"""
with pytest.raises(ValueError):
# 자동차 이름이 빈 경우에 대한 입력을 모의 처리
with patch('builtins.input', side_effect=["pobi,won, ", "1"]):
main() # 프로그램 실행


# 시도 횟수에 문자열 입력에 대한 예외 처리 테스트
def test_시도_횟수에_문자열_입력에_대한_예외():
"""
시도 횟수에 문자열 입력에 대한 예외 처리를 테스트합니다.
'pytest.raises'를 사용해 IllegalArgumentException과 유사한 ValueError를 발생시키는지 검증합니다.
"""
with pytest.raises(ValueError):
# 시도 횟수에 문자열이 입력된 경우에 대한 입력을 모의 처리
with patch('builtins.input', side_effect=["pobi,won", "abc"]):
main() # 프로그램 실행
Loading