211021 알고리즘

이은택·2021년 10월 21일
0

알고리즘

목록 보기
10/15
post-thumbnail

코드잇 파이썬 기초문제


숫자 야구: 합치기

문제이해 6분

1차 풀이

풀이 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

문제점

  • 스트라이크 횟수가 3번으로 만족 되어도 한번 더 마지막에 입력한 값을 타이핑 해주어야 한다.
  • 한번에 다 풀고 굳이 각각의 함수로 쪼개서 고려해질게 추가됨
  • 몇번 시도 했는지 출력값 없음

2차 풀이

풀이 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 , 그럴 확률이 높아 보임
profile
도전!

0개의 댓글