while문 다음으로 출력이 되지 않습니다.

조회수 508회

일단 코드가 길다는 점 죄송합니다.

흔히 아시는 '책장넘기기(책장을 한 번 넘겨서 나온 페이지의 각 숫자를 더하는 게임)' 의 코드입니다. 여기에 추가로 세 사람이 돌아가며 책을 넘기고, 가장 높은 숫자가 나온 사람이 1점을 가져가서 총 10점을 얻는 사람이 승자이고, 게임이 끝나는 코드를 작성할려고 합니다.

그런데 아래의 코드를 실행해 보았더니 while문 다음으로는 출력이 되지 않더군요. error메세지는 뜨지도 않습니다. (while문 전까지만 출력이 됩니다.)

제가 뭘 잘못 입력한건가요 ??

import random

def a_book (n):

    answer_a = 0
    while n>0 :
        answer_a += n%10
        n//=10
    return answer_a  

ap = random.randrange(100, 999) # @p = @의 랜덤 page

print(f"a가 펼친 페이지는 {ap}")

print(f"a의 결과는 {a_book(ap)}")

def b_book (n):

    answer_b=0
    while n>0 :
        answer_b += n%10
        n//=10
    return answer_b  

bp = random.randrange(100, 999)

print(f"b가 펼친 페이지는 {bp}")

print(f"b의 결과는 {b_book(bp)}")

def c_book (n):

    answer_c =0
    while n>0 :
        answer_c += n%10
        n//=10
    return answer_c  

cp = random.randrange(100, 999)

print(f"c가 펼친 페이지는 {cp}")

print(f"c의 결과는 {c_book(cp)}")

a_win, b_win, c_win = 0,0,0

while a_win == 10 or b_win == 10 or c_win == 10:

    if a_book(ap) > b_book(bp) and a_book(ap) > c_book(cp):
        a_win += 1
        print(f"a의 점수: {a_win} , b의 점수: {b_win}, c의 점수: {c_win}")
    elif b_book(bp) > a_book(ap) and b_book(bp) > c_book(cp):
        b_win += 1
        print(f"a의 점수: {a_win} , b의 점수: {b_win}, c의 점수: {c_win}")
    elif c_book(cp) > a_book(ap) and c_book(cp) > b_book(bp):
        c_win += 1
        print(f"a의 점수: {a_win} , b의 점수: {b_win}, c의 점수: {c_win}")
    else:
        print("무효!")

2 답변

  • while a_win < 10 or b_win < 10 or c_win < 10:
    
    • 앗... 틀렸나보다. nowp 2022.5.17 13:53
    • 고수분 들이 많으니까 뭔가 쭈그리 같은 존재가 되는 것 같네요. 앞으로는 울지 않고 질문할게욤! 조민수 2022.5.17 14:07
    • 근데 while문을 저렇게 고치니 무한반복(@_win이 10을 넘어가도 계속 실행)이 되던데 뭐가 문제일까요?? 조민수 2022.5.17 14:08
    • @민트초코민트 : 드모르강의 법칙 이라고 있어요. nowp 2022.5.17 14:18
  • 뇌에 힘 줘서 잘 생각해 봅시다!!

    # 다음 함수는 승자가 나왔을 때 True를 반환합니다. 맞죠?
    def somebody_has_won() :
        return a_win >= 10 or b_win >= 10 or c_win >= 10
    
    # 그렇다면 다음 함수는 승자가 나오지 않았을 때 True를 반환하겠지요.
    def nobody_has_one() :
        return somebody_has_one() is False
    
    # 그런데 게임을 무한 반복한다는 것은, 승자가 나오지 않았을 때 해야 되는 일 아닐까요? 승자가 나왔을 때 말고요.
    while (nobody_has_one()) :
        if result_a > result_b and result_a > result_c: # 이하 생략...
    
    # 하지만 원문 코드는 승자가 나오지 않았던 시점에서 "승자가 나왔을 때 게임을 무한히 계속하는" 코드입니다. 그래서 아무 일도 일어나지 않은 거에요.
    # 개선 방향은 여러 가지가 있을 테니, 문제의 핵심을 스스로 이해하고 직접 고쳐 봅시다.
    # 보너스 1: somebody_has_won() 없이 nobody_has_one()을 정의하려면?
    # 보너스 2: nobody_has_one() 없이 while문에 곧바로 쓰려면?
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)