코세라 미시간 대학 파이썬 반복문 과제 중 질문
조회수 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부분에서 반복을 종료 못하고 무한 루프를 하는 사태도 발생하고 있습니다. 기초 강의인데도 불구하고 과제 하나 이렇게 오래 걸리는거가 우울해집니다... 어떻게든 혼자서 해결하고 싶었는데 이틀 째 삽질만 하는지라 여러분들께서 조언 해주신다면 많은 도움이 될 거 같습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
1) 질문자님이 작성하신 코드는 (문법적으로 틀린 게 많지만 무시하자면) 대략 이런 아이디어인 것 같습니다.
- 전체 입력값을
numbers
리스트로 받는다. - 현재 입력값이
numbers
리스트에 있는 어떤 값보다 크다면 현재 입력값을 출력한다. - 현재 입력값이 숫자가 아니라면
"It's a wrong number"
문자열을 출력한다.
정확히 이 아이디어대로만 일을 수행하면 작동을 할까요? 안 할 겁니다. 아이디어(정확히는 '절차')가 부족합니다. 주어진 요구사항은 간단해 보이지만, 우리(또는 컴퓨터)가 그 요구사항을 수행하는 순서에는 훨씬 더 많은 절차가 더 명확하게 주어져야 합니다. 나보고 이 일을 처리하라고 하면 어떻게 할 것인가를 생각해 보면 도움이 됩니다.
2) 자 그러면 그 절차에 대해서 생각을 해봅시다. 만약에,
교수님이 지나가다가 갑자기 질문자님을 불러세워서 말씀하십니다.
"이제부터 내가 다 됐다고 할 때까지 숫자나 문자를 몇 개 불러주겠어요. 잘 듣고 최대값과 최소값을 알려주세요."그러면 이럴 때 우리는 보통 어떻게 하나요?
- 일단 노트와 펜을 꺼내겠죠. 무슨 숫자를 몇 개나 불러주실 지 알 수가 없으니.
- 교수님이 불러주시는 것들을 하나씩 듣겠지요.
- 만약 방금 들은 것이 숫자가 아니라면, 그게 "다 됐다"였는지 아닌지 생각해볼 겁니다. 만약 "다 됐다"가 아니라면 "교수님 그건 숫자가 아닌데요 다시 말씀해 주시겠습니까?"라고 따져야 하고, "다 됐다"였다면 노트에 숫자를 받아적는 건 그만해도 되겠지요.
- 만약 방금 들은 것이 숫자가 맞다면, 그 숫자를 군말없이 노트에 받아적겠지요.
- 노트에 숫자를 적을 만큼 다 적었다면 이제 적힌 숫자들을 맨 첫번째 것부터 쭉 보겠죠. 만약 노트에 딱히 숫자가 적힌 게 없다면 "교수님 숫자를 한개도 안불러주셨는데요"라고 따지겠죠.
- 노트의 숫자들을 쭉 보면서, 지금까지 본 제일 큰 숫자보다 더 큰 숫자를 보게 되었으면 그걸 최대값으로, 지금까지 본 제일 작은 숫자보다 더 작은 숫자를 보게 되었으면 그걸 최소값으로 대답해야겠다고 기억해 두겠지요.
- 그런 식으로 마지막 숫자까지 보고 나면 뭔가 최대값과 최소값이 머릿속에 남아있겠죠. 그걸 교수님께 알려드리면 끝.
이 시나리오는 우리가 실제로 이런 과제를 (1) 순서에 따라서 (2) 논리적 예외 없이 (3) 꼭 필요한 것만 수행하는 절차를 늘어놓아 본 것입니다. (이걸 '식순' 즉 "프로그램"이라고 합니다.) 이 절차대로 교수님이 시킨 일을 수행하면 별 문제가 있을까요? 없겠죠. (그러면 혹시, 어차피 별문제 없을 거, 이걸 그냥 컴퓨터의 언어로 번역만 해서 그대로 컴퓨터한테 가르쳐 놓으면, 컴퓨터가 그걸 대신하더라도 딱히 별문제 없이 잘 처리되지 않을까요? 이걸 프로그래밍이라고 합니다.)
3) 아래는 순전히 질문자분이 파이선 기초 문법을 많이 어기고 계신 것 같아서 참고하시라고 적어 본 유사코드(pseudo-code)입니다. 여기서부터는 직접 시도해 보시길 바랍니다. (테스트는 안해봤으니까요.)
최대값 = (모르겠음) 최소값 = (모르겠음) 지금까지나온숫자들 = (빈목록) 무조건되풀이할것 : 입력값 = 입력받기 만약 입력값 == '다됐다' : 되풀이그만할것 아니면 : 해보기 : # 'try' 부분입니다. 입력값 = 숫자로바꾸기 입력값 # 파이썬에서 '정수아닌것 = int(정수아닌것)' 구문은 낭패를 당할 겁니다. 지금까지나온숫자들 에 추가하기 입력값 해보다가낭패를당하면 : # 'except' 부분입니다. 따지기 "그건 숫자가 아닌데요 다시 불러주세요" 만약 지금까지나온숫자들 갯수 == 0 : 따지기 "숫자를 한 개도 안 불러주셨는데요 다시해주세요" 아니면 : 지금까지나온숫자들 하나씩 x라고하고 보기 : # 'for' 반복문입니다. 파이썬은 리스트 전체를 도는 for 약식문법이 존재하므로 이렇게 약식으로 적었습니다. 만약 x > 최대값 : 최대값 = x 만약 x < 최소값 : 최소값 = x 알려주기 "제일 큰 숫자는" 최대값 "입니다" 알려주기 "제일 작은 숫자는 " 최소값 "입니다 그럼 저는 이만"
끝으로 코드 길이에 대해서 궁금해하셨는데... "길이"만 갖고 얘기하자면, 다음 알고리즘을 쓰면 더 짧은 코드로 처리할 수도 있습니다. 과제 자체는 이걸 더 의도한 것 같네요. 이 시나리오는 노트(메모리)는 적게 쓰지만 번번이 판단(연산)을 많이 해야 하므로 거기서 프로그램상의 성능 차이가 생길 겁니다.
- 노트에 "최대값: ____ 최소값: ____" 하는 식으로 빈칸을 2개 만들어 둡니다.
- 교수님이 뭔가 말씀하실 때마다 즉석에서 다음과 같이 판단을 합니다.
- 만약 숫자를 말씀하셨다면: 그 숫자를 노트에 적어 놓은 최대값 및 최소값과 바로 비교합니다.
- 노트에 적은 최대값보다 큰 수를 부르신 거라면 노트에 적힌 최대값을 그 수로 고쳐 적고 다음 말씀을 기다립니다.
- 노트에 적은 최소값보다 작은 수를 부르신 거라면 노트에 적힌 최소값을 그 수로 고쳐 적고 다음 말씀을 기다립니다.
- 둘 다 아니라면 그냥 지나가고 다음 말씀을 기다립니다.
- 만약 숫자가 아닌 걸 말씀하셨다면: 그 말씀이 "다 됐다"였는지 아닌지 판단합니다.
- "다 됐다"가 아니었다면 숫자를 말씀해 달라고 따진 뒤 다음 말씀을 기다립니다.
- "다 됐다"였으면 지금 노트에 적혀 있는 최대값과 최소값을 알려드리고 끝냅니다.
- 만약 숫자를 말씀하셨다면: 그 숫자를 노트에 적어 놓은 최대값 및 최소값과 바로 비교합니다.
- 정말 감사합니다. 저 스스로도 모르는 상태에서 답을 보고 이해하려고 하는 과정보다, 계속 고민하며 답을 찾아가고 싶었는데 엽토군님께서 주신 힌트와 설명이 너무나도 큰 도움이 되었습니다. 아직 코드를 다시 정리하진 않았지만 정성스러운 설명에 최대한 빨리 감사를 표하고 싶어 먼저 답글을 적습니다. 고맙습니다 : ) 알 수 없는 사용자 2018.9.30 19:36
- 도움이 되었다니 다행입니다 열공하셔서 나중에 다른분들 궁금증도 해결해주세요 엽토군 2018.9.30 19:43
- 덕분에 무사히 인터넷 코딩 테스트 통과했습니다 : ) 계속 틀려버려서 피해다니는 식으로 코드를 완성해 100% 이해 한다곤 못하지만 제가 만든 코드를 바탕으로 책이든 강좌든 다시 보면서 저 본인이 어떻게 여기까지 도달했는지를 복습하면서 이해하려고 합니다. 다시 한 번 정말 감사합니다. 알 수 없는 사용자 2018.10.1 02:14
- 전체 입력값을
댓글 입력