문제이해 6분
풀이 30분
머지 30분
import random
def generate_numbers():
three_numbs = []
while len(three_numbs) < 3:
random_numb = random.randint(0, 9)
if random_numb not in three_numbs:
three_numbs.append(random_numb)
# print(f"3개의 랜덤 숫자는 {three_numbs}")
print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.")
while take_guess(three_numbs) != 3:
take_guess(three_numbs)
def take_guess(three_numbs):
type_three_numbs = []
place_of_numb = 1
print("숫자 3개를 하나씩 차례대로 입력하세요.")
while len(type_three_numbs) < 3:
numb = int(input(f"{place_of_numb}번째 숫자를 입력하세요: "))
if numb in type_three_numbs:
print("중복되는 숫자 입니다. 다시 입력하세요.")
elif numb not in list(range(10)):
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
elif numb not in type_three_numbs:
type_three_numbs.append(numb)
place_of_numb += 1
# print(f"3개의 추측 숫자는 {type_three_numbs}")
return get_score(type_three_numbs, three_numbs)
def get_score(type_three_numbs, three_numbs):
strike = 0
ball = 0
for index in range(3):
if type_three_numbs[index] == three_numbs[index]:
strike += 1
elif type_three_numbs[index] in three_numbs:
ball += 1
print(f"{strike}S {ball}B")
print()
return strike
generate_numbers()
# 출력 테스트:
# 0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 1
# 2번째 숫자를 입력하세요: 2
# 3번째 숫자를 입력하세요: 3
# 0S 0B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 4
# 2번째 숫자를 입력하세요: 5
# 3번째 숫자를 입력하세요: 6
# 1S 1B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 5
# 2번째 숫자를 입력하세요: 8
# 3번째 숫자를 입력하세요: 6
# 2S 0B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 5
# 2번째 숫자를 입력하세요: 9
# 3번째 숫자를 입력하세요: 6
# 3S 0B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 5
# 2번째 숫자를 입력하세요: 9
# 3번째 숫자를 입력하세요: 6
# 3S 0B
풀이 15분
import random
def generate_numbers():
three_numbs = []
while len(three_numbs) < 3:
random_numb = random.randint(0, 9)
if random_numb not in three_numbs:
three_numbs.append(random_numb)
# print(f"3개의 랜덤 숫자는 {three_numbs}")
print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.")
return three_numbs
def take_guess(three_numbs):
tries = 0📌
while True:
type_three_numbs = []
place_of_numb = 1
print("숫자 3개를 하나씩 차례대로 입력하세요.")
while len(type_three_numbs) < 3:
numb = int(input(f"{place_of_numb}번째 숫자를 입력하세요: "))📌
if numb in type_three_numbs:
print("중복되는 숫자 입니다. 다시 입력하세요.")
elif numb not in list(range(10)):
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
elif numb not in type_three_numbs:
type_three_numbs.append(numb)
place_of_numb += 1
# print(f"3개의 추측 숫자는 {type_three_numbs}")
tries += 1
if get_score(type_three_numbs, three_numbs) == 3:
print(f"축하합니다. {tries}번 만에 숫자 3개의 값과 위치를 모두 맞추셨습니다.")
break
def get_score(type_three_numbs, three_numbs):
strike = 0
ball = 0
for index in range(3):
if type_three_numbs[index] == three_numbs[index]:
strike += 1
elif type_three_numbs[index] in three_numbs:
ball += 1
print(f"{strike}S {ball}B")
print()
return strike
three_numbs = generate_numbers()📌
take_guess(three_numbs)
# 출력 테스트:
# 0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 1
# 2번째 숫자를 입력하세요: 2
# 3번째 숫자를 입력하세요: 3
# 0S 0B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 4
# 2번째 숫자를 입력하세요: 5
# 3번째 숫자를 입력하세요: 6
# 1S 1B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 3
# 2번째 숫자를 입력하세요: 4
# 3번째 숫자를 입력하세요: 5
# 0S 1B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 3
# 2번째 숫자를 입력하세요: 5
# 3번째 숫자를 입력하세요: 6
# 1S 1B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 2
# 2번째 숫자를 입력하세요: 3
# 3번째 숫자를 입력하세요: 4
# 0S 0B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 4
# 2번째 숫자를 입력하세요: 5
# 3번째 숫자를 입력하세요: 6
# 1S 1B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 6
# 2번째 숫자를 입력하세요: 5
# 3번째 숫자를 입력하세요: 4
# 0S 2B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 5
# 2번째 숫자를 입력하세요: 4
# 3번째 숫자를 입력하세요: 6
# 2S 0B
#
# 숫자 3개를 하나씩 차례대로 입력하세요.
# 1번째 숫자를 입력하세요: 5
# 2번째 숫자를 입력하세요: 7
# 3번째 숫자를 입력하세요: 6
# 3S 0B
#
# 축하합니다. 9번 만에 숫자 3개의 값과 위치를 모두 맞추셨습니다.
take_guess(three_numbs)
의 파라미터
와 호출할때 썻던 인자값의 변수이름
을 똑같이 지었는데 조금이라도 다르게 해둘 필요가 있었을까?elif
를 쓰는 것이 프로그래밍의 실수를 더 잘 알아 차릴 수 있다고 생각을 하는데 마지막 조건문이라고 else
를 굳이 써야 되는 이유가 있을까?take_guess
와 연관이 별로 없어 보이는 변수 tries
를 굳이 넣어서 풀이 하지 말것. 함수 이름에 맞는 값들을 리턴하는 것을 중점으로 풀이하고 마지막에 각 함수들을 조합해서 출력하는 알고리즘을 따로 짜는 것이 직관적이고 복잡해 보이지 않을 듯 싶음place_of_numb
변수를 굳이 만들지 않고 늘어나는 추측 숫자들의 리스트의 길이와 format
함수를 활용해서 응용 가능상수
만 대문자가 가능할까 아니면 변하지 않는 값인 리스트
나 딕션어리
도 변수이름을 대문자로 표현을 할까? 대문자 소문자 형식 고민인 변수 three_numbs
, 그럴 확률이 높아 보임