문제이해 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 , 그럴 확률이 높아 보임