Python TIL(2) - While문 실습

random·2021년 3월 16일
0

Python - TIL

목록 보기
2/19

오늘의 코드: 업다운 추측게임

사용자가 추측하는 1~1000까지의 숫자를 컴퓨터로 하여금 추측하게 하는 프로그램


low = 1
high = 1000

print("Please think of a number between {} and {}".format(low, high))
input("Press ENTER to start")
guesses = 1 
  • low, high 변수명을 이용해 사용자가 추측할 수 있는 최소값 최대값 범위 설정
  • {}.format을 이용하여 최소값, 최대값 알려주기
  • input 명령을 이용해 사용자로 하여금 게임 시작권을 양도하기 (뜬금없이 빈칸에서 아무 지시 없이 시작되는 것보다 이렇게 친절한 안내를 해주는게 더 착한 프로그램!)
  • guesses 변수명을 1부터 시작하는 정수로 initializing 하는 기능

while True:
    guess = low + (high - low) // 2
    high_low = input("My guess is {}. Should I guess higher or lower?" 
    " Enter h or l or c if my guess was correct: ".format(guess)).casefold()

    if high_low == "h":
        # Guess higher. The low end of the range becomes 1 greater than the guess.
        low = guess + 1

    elif high_low == "l":
        # Guess hihger. The high end of the range becomes one less than the guess.
        high = guess - 1

    elif high_low == "c":
        print("I got it in {} guesses!".format(guesses))
        break

    else:
        print("Please enter h, l or c")
    
    guesses += 1 
    
  • 컴퓨터 공학에서 흔히 사용되는 binary search 개념 접목; 특정 범위 내의 탐색 목표를 향해 반값을 나누면서 근접해져가는 기법. 해당 반을 선정하면 나머지 반까지 다 탐색할 필요가 없어 시간복잡성 측면에서 전체를 탐색 범위로 두는 것 보다 더 효율적인 방법임!
  • if 절과, elif 절의 low = guess +1/-1 표현을 통해서 불필요한 나머지 반을 자르는 기능을 수행함.
  • else 문을 통해 원하는 값이 아닌 값이 입력됬을 시 재입력을 요청함.
  • guesses += 1 표현을 통해서 몇 번만에 맞추었는지 그 횟수도 카운팅 하는 기능 추가.
  • binary search를 통해 이론적으로/실제로도 1000의 범위 안에서 10번이하로 무조건 답을 맞추는 프로그램 완성.

<위와는 조금 다른 버전>


guesses = 1 

while low != high:
    guess = low + (high - low) // 2
    high_low = input("My guess is {}. Should I guess higher or lower?" 
    " Enter h or l or c if my guess was correct: ".format(guess)).casefold()

    if high_low == "h":
        # Guess higher. The low end of the range becomes 1 greater than the guess.
        low = guess + 1

    elif high_low == "l":
        # Guess hihger. The high end of the range becomes one less than the guess.
        high = guess - 1

    elif high_low == "c":
        print("I got it in {} guesses!".format(guesses))
        break

    else:
        print("Please enter h, l or c")
    
    guesses += 1 

else:
    print("You thought of the number {}".format(low))
    print("I got it in {} guesses".format(guesses))
  • 첫 번째 버전과 두 번째 버전의 차이점은, 고점과 저점이 서로 같아질 때 (10번 이하의 추측 이후 최종 도달할 정답지점) 전자의 경우에는 바보같이 계속 사용자에게 재질문을 끊임없이 하고, 후자는 알아서 깔끔하게 정답을 맞춤. 사실 컴퓨터는 굉장히 똑똑해보이는 두뇌회전이 빠른 바보라서, 일거수 일투족을 다 알려주어야만함. => While 구문 시작시 while low != high와 동일 indentation 선상에서의 else 문을 통해서 loop에서 break되어 빠져나올 수 있게 설정함.

  • 마지막 else문은 위에 while loop 중간에서 break가 적용안되고 끝까지 다 수행했음을 의미함. (영문 표기 그대로의 otherwise의 의미를 지니는 'else'보다 문제없이 위 루프를 온전히, 완전히 수행했다는 의미로 'nobreak' 아니면 'completed'가 더 맞는 표현일 수도 있음)

0개의 댓글