코세라 미시간 대학 파이썬 반복문 과제 중 질문

조회수 1025회

Write a program that repeatedly prompts a user for integer numbers until the user enters 'done'. Once 'done' is entered, print out the largest and smallest of the numbers. If the user enters anything other than a valid number catch it with a try/except and put out an appropriate message and ignore the number. Enter 7, 2, bob, 10, and 4 and match the output below.

사용자가 'done'될 때까지 정수 번호를 입력하라는 메시지를 반복적으로 표시하는 프로그램을 작성한다. 'done'를 입력하면 가장 크고 작은 숫자를 출력한다. 사용자가 유효한 숫자 이외의 숫자를 입력하면 try/except로 해당 숫자를 캡처하고 적절한 메시지를 표시하고 해당 숫자를 무시합니다. 7, 2, bob, 10 및 4를 입력하고 아래 출력과 일치시킵니다.

largest = None
smallest = None
while True:
    num = input("Enter a number: ")
    if num == "done" : break
    print(num)

print("Maximum", largest)

위가 힌트 코드입니다. 요는 done를 출력하면 예시 숫자를 반복 처리시켜 최대 값과 최소 값을 출력시키고, 그 외 값은 틀린 값고 함께 다시 입력을 continue로 되돌리는 방식 같은데... 제 코드는 계속 꼬이면서 오류가 납니다...

largest = None
smallest = None
numbers = [7, 2,'bob', 10, 4]


while True :
    num = input('Enter a number: ')
    if num == 'done' : break
        for num > numbers :

    print(num)

    else num =! numbers
    print("It's wrong number")
    print(largest, smallest)
    continue

print('Invalid input')
print('Maximum is ' largest)
print('Minimum is ' smallest)

제가 작성하고 있는 코드입니다. 이렇게 길면 안될거 같은데도 더 길어질거 같고, break부분에서 반복을 종료 못하고 무한 루프를 하는 사태도 발생하고 있습니다. 기초 강의인데도 불구하고 과제 하나 이렇게 오래 걸리는거가 우울해집니다... 어떻게든 혼자서 해결하고 싶었는데 이틀 째 삽질만 하는지라 여러분들께서 조언 해주신다면 많은 도움이 될 거 같습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 여기서 과제 물어보면 묻혀요 ㅋㅋ Promixium 2018.9.30 15:49
  • 과제 질문이라 하더라도 남보고 다해달라는 식이 아니면 괜찮다고 생각합니다. 초보여서 뭘 모르는지 모르는 상태와 공부를 싫어하는 것은 구분하면 좋을것 같습니다. 엽토군 2018.9.30 16:35
  • 그렇군요.. Promixium 2018.9.30 16:50
  • 누구에게 물어볼 공간을 찾고 찾아 댕기다가 찾은 사이트라 조급하게 글을 썻나 봅니다. 생각해보니 단순히 대학이나 학원에서 내는 과제의 답을 구하기 위해 서비스를 악용하려는 유저도 있겠군요. 다음부터는 좀 더 유의하며 날로 먹으려는 유저로 보이지 않게 글을 적겠습니다. 충고 감사드립니다. 알 수 없는 사용자 2018.9.30 19:38
  • 아닙니다! 좋은 의도라면 언제든지 괜찮아요 :) Promixium 2018.10.2 09:43
  • 이렇게만 글 적으면 능력자분들이 친절히 알려주시죠ㅎㅎ 알 수 없는 사용자 2018.10.2 20:09

1 답변

  • 1) 질문자님이 작성하신 코드는 (문법적으로 틀린 게 많지만 무시하자면) 대략 이런 아이디어인 것 같습니다.

    • 전체 입력값을 numbers 리스트로 받는다.
    • 현재 입력값이 numbers 리스트에 있는 어떤 값보다 크다면 현재 입력값을 출력한다.
    • 현재 입력값이 숫자가 아니라면 "It's a wrong number" 문자열을 출력한다.

    정확히 이 아이디어대로만 일을 수행하면 작동을 할까요? 안 할 겁니다. 아이디어(정확히는 '절차')가 부족합니다. 주어진 요구사항은 간단해 보이지만, 우리(또는 컴퓨터)가 그 요구사항을 수행하는 순서에는 훨씬 더 많은 절차가 더 명확하게 주어져야 합니다. 나보고 이 일을 처리하라고 하면 어떻게 할 것인가를 생각해 보면 도움이 됩니다.


    2) 자 그러면 그 절차에 대해서 생각을 해봅시다. 만약에,

    교수님이 지나가다가 갑자기 질문자님을 불러세워서 말씀하십니다.
    "이제부터 내가 다 됐다고 할 때까지 숫자나 문자를 몇 개 불러주겠어요. 잘 듣고 최대값과 최소값을 알려주세요."

    그러면 이럴 때 우리는 보통 어떻게 하나요?

    1. 일단 노트와 펜을 꺼내겠죠. 무슨 숫자를 몇 개나 불러주실 지 알 수가 없으니.
    2. 교수님이 불러주시는 것들을 하나씩 듣겠지요.
    3. 만약 방금 들은 것이 숫자가 아니라면, 그게 "다 됐다"였는지 아닌지 생각해볼 겁니다. 만약 "다 됐다"가 아니라면 "교수님 그건 숫자가 아닌데요 다시 말씀해 주시겠습니까?"라고 따져야 하고, "다 됐다"였다면 노트에 숫자를 받아적는 건 그만해도 되겠지요.
    4. 만약 방금 들은 것이 숫자가 맞다면, 그 숫자를 군말없이 노트에 받아적겠지요.
    5. 노트에 숫자를 적을 만큼 다 적었다면 이제 적힌 숫자들을 맨 첫번째 것부터 쭉 보겠죠. 만약 노트에 딱히 숫자가 적힌 게 없다면 "교수님 숫자를 한개도 안불러주셨는데요"라고 따지겠죠.
    6. 노트의 숫자들을 쭉 보면서, 지금까지 본 제일 큰 숫자보다 더 큰 숫자를 보게 되었으면 그걸 최대값으로, 지금까지 본 제일 작은 숫자보다 더 작은 숫자를 보게 되었으면 그걸 최소값으로 대답해야겠다고 기억해 두겠지요.
    7. 그런 식으로 마지막 숫자까지 보고 나면 뭔가 최대값과 최소값이 머릿속에 남아있겠죠. 그걸 교수님께 알려드리면 끝.

    이 시나리오는 우리가 실제로 이런 과제를 (1) 순서에 따라서 (2) 논리적 예외 없이 (3) 꼭 필요한 것만 수행하는 절차를 늘어놓아 본 것입니다. (이걸 '식순' 즉 "프로그램"이라고 합니다.) 이 절차대로 교수님이 시킨 일을 수행하면 별 문제가 있을까요? 없겠죠. (그러면 혹시, 어차피 별문제 없을 거, 이걸 그냥 컴퓨터의 언어로 번역만 해서 그대로 컴퓨터한테 가르쳐 놓으면, 컴퓨터가 그걸 대신하더라도 딱히 별문제 없이 잘 처리되지 않을까요? 이걸 프로그래밍이라고 합니다.)


    3) 아래는 순전히 질문자분이 파이선 기초 문법을 많이 어기고 계신 것 같아서 참고하시라고 적어 본 유사코드(pseudo-code)입니다. 여기서부터는 직접 시도해 보시길 바랍니다. (테스트는 안해봤으니까요.)

    최대값 = (모르겠음)
    최소값 = (모르겠음)
    지금까지나온숫자들 = (빈목록)
    
    무조건되풀이할것 :
        입력값 = 입력받기
        만약 입력값 == '다됐다' :
            되풀이그만할것
        아니면 :
            해보기 : # 'try' 부분입니다.
                입력값 = 숫자로바꾸기 입력값 # 파이썬에서 '정수아닌것 = int(정수아닌것)' 구문은 낭패를 당할 겁니다.
                지금까지나온숫자들 에 추가하기 입력값
            해보다가낭패를당하면 : # 'except' 부분입니다.
                따지기 "그건 숫자가 아닌데요 다시 불러주세요"
    
    만약 지금까지나온숫자들 갯수 == 0 :
        따지기 "숫자를 한 개도 안 불러주셨는데요 다시해주세요"
    아니면 :
        지금까지나온숫자들 하나씩 x라고하고 보기 : # 'for' 반복문입니다. 파이썬은 리스트 전체를 도는 for 약식문법이 존재하므로 이렇게 약식으로 적었습니다.
            만약 x > 최대값 :
                최대값 = x
            만약 x < 최소값 :
                최소값 = x
        알려주기 "제일 큰 숫자는" 최대값 "입니다"
        알려주기 "제일 작은 숫자는 " 최소값 "입니다 그럼 저는 이만"
    

    끝으로 코드 길이에 대해서 궁금해하셨는데... "길이"만 갖고 얘기하자면, 다음 알고리즘을 쓰면 더 짧은 코드로 처리할 수도 있습니다. 과제 자체는 이걸 더 의도한 것 같네요. 이 시나리오는 노트(메모리)는 적게 쓰지만 번번이 판단(연산)을 많이 해야 하므로 거기서 프로그램상의 성능 차이가 생길 겁니다.

    1. 노트에 "최대값: ____ 최소값: ____" 하는 식으로 빈칸을 2개 만들어 둡니다.
    2. 교수님이 뭔가 말씀하실 때마다 즉석에서 다음과 같이 판단을 합니다.
      • 만약 숫자를 말씀하셨다면: 그 숫자를 노트에 적어 놓은 최대값 및 최소값과 바로 비교합니다.
        • 노트에 적은 최대값보다 큰 수를 부르신 거라면 노트에 적힌 최대값을 그 수로 고쳐 적고 다음 말씀을 기다립니다.
        • 노트에 적은 최소값보다 작은 수를 부르신 거라면 노트에 적힌 최소값을 그 수로 고쳐 적고 다음 말씀을 기다립니다.
        • 둘 다 아니라면 그냥 지나가고 다음 말씀을 기다립니다.
      • 만약 숫자가 아닌 걸 말씀하셨다면: 그 말씀이 "다 됐다"였는지 아닌지 판단합니다.
        • "다 됐다"가 아니었다면 숫자를 말씀해 달라고 따진 뒤 다음 말씀을 기다립니다.
        • "다 됐다"였으면 지금 노트에 적혀 있는 최대값과 최소값을 알려드리고 끝냅니다.
    • 정말 감사합니다. 저 스스로도 모르는 상태에서 답을 보고 이해하려고 하는 과정보다, 계속 고민하며 답을 찾아가고 싶었는데 엽토군님께서 주신 힌트와 설명이 너무나도 큰 도움이 되었습니다. 아직 코드를 다시 정리하진 않았지만 정성스러운 설명에 최대한 빨리 감사를 표하고 싶어 먼저 답글을 적습니다. 고맙습니다 : ) 알 수 없는 사용자 2018.9.30 19:36
    • 도움이 되었다니 다행입니다 열공하셔서 나중에 다른분들 궁금증도 해결해주세요 엽토군 2018.9.30 19:43
    • 덕분에 무사히 인터넷 코딩 테스트 통과했습니다 : ) 계속 틀려버려서 피해다니는 식으로 코드를 완성해 100% 이해 한다곤 못하지만 제가 만든 코드를 바탕으로 책이든 강좌든 다시 보면서 저 본인이 어떻게 여기까지 도달했는지를 복습하면서 이해하려고 합니다. 다시 한 번 정말 감사합니다. 알 수 없는 사용자 2018.10.1 02:14

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

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

(ಠ_ಠ)
(ಠ‿ಠ)