Python 과제: 입력 및 출력

4 분 소요

문제

실행결과가 다음과 같이 되도록 프로그램을 작성하시오.

Problem

아래의 해설을 보지 마시고, 최대한 고민해서 이 문제를 풀어보시기 바랍니다.

해설

우선 직관적으로 이 문제를 보신 후에는 반자동적으로 파란색 박스와 빨간색 박스가 무엇을 의미하는지를 파악하셔야 합니다.

또한 파란색 박스와 빨간색 박스 각각에 동일한 문법(Syntax)이 들어가는지도 파악하셔야 합니다.

여기까지 문제에서 필요한 부분들을 추출하셨다면, 바로 문제풀이에 들어가시면 됩니다.

먼저 파란색 박스를 보시면 아시겠지만, 물음에 대한 답변을 해야합니다.

그런데 그 답변은 딱 정해진 답이 아닌 사용자에 따라서 천차만별로 달라질 수 있는 답입니다.

그러므로 답변에 대한 답을 얻을 때는 사용자가 그 답을 입력하는 방식으로 진행하는 것이 좋을것 같습니다.

파이썬에서 입력을 받기 위해서는 어떤 문법을 사용해야할까요?

input() 함수를 사용해야 하며, 문법 구조는 다음과 같습니다.

Syntax

  input(prompt)
  • 여기서 prompt는 사용자로부터 입력을 받기 전에 기본적으로 표시되는 메시지 즉, 문자열입니다.

  • 문법 구조에서 명시되지는 않았지만, 사용자로부터 입력을 받았다면 입력 받은 값을 저장할 변수가 필요합니다. 왜냐하면 사용자로부터 입력 받은 값을 변수를 통해서 이용할 수 있기 때문입니다.

그러므로 다음과 같이 변수도 함께 작성해주셔야 합니다.

x = input()

여기까지 기본적인 input 함수 사용법에 대해서 알아보았습니다.

그럼 이제 문제를 풀어보면서 위의 설명이 의미하는 바를 이해해봅시다.

먼저 문제를 보시면, 문제의 첫번째 줄에서 ““당신의 이름은 무엇인가요?”“가 화면에 출력되어야 하고, 그 이후에 사용자로부터 입력을 받아야 함을 알 수 있습니다.

그런데 출력에 필요한 별도의 함수(print())를 이용해서 화면에 출력할 수도 있지만, 위의 설명에서처럼 input 함수의 인자로 건네준 문자열이 사용자로부터 입력을 받기 전에 기본적으로 표시되므로 다음처럼 작성하면 됨을 알 수 있습니다.

input("당신의 이름은 무엇인가요?")

또한, 위의 설명에서처럼 사용자로부터 입력받은 값을 별도의 변수에 저장해야 이를 이용할 수 있으므로, 변수도 함께 작성해주셔야 합니다.

변수의 이름은 아무래도 의미있는 이름이면 좋겠죠?

그러므로 저는 변수명을 name으로 작성하겠습니다.

name = input("당신의 이름은 무엇인가요?")

여기까지 하셨다면, 문제의 첫 번째 줄은 해결하였습니다.

이번에는 두 번째 줄로 넘어가봅시다.

빨간색 네모 박스를 보시면 아시겠지만 이는 사용자로부터 입력받은 사용자의 이름을 출력해줘야 함을 알 수 있습니다.

그런데 우리는 위에서 사용자로부터 입력받은 이름 값을 name이라는 변수에 저장하였으므로, 이 변수의 값을 단순히 불러들여서 출력만 해주면 됨을 알 수 있습니다.

파이썬에서 출력을 담당하는 문법은 무엇일까요?

이는 print() 함수이며, 문법 구조는 다음과 같습니다.

Syntax

print(object(s), sep=separator, end=end, file=file, flush=flush)
  • 여기서 object(s)는 필수적으로 전달하여야 하는 인자이며, 그 이름이 의미하듯이 어떠한 객체든 그 수에 상관없이 전달할 수 있으며, 이러한 객체들은 출력되기 전에 모두 문자열로 변환됩니다.

  • sep=’separator’는 선택적이며, 객체들이 2개 이상이라면 이들을 구분짓는 방법을 명시한다. 기본값은 ‘ ‘이다.

  • end=’end’는 선택적이며, 끝에 무엇을 출력할지를 명시한다. 기본값은 ‘\n’(개행)이다.

  • file은 선택적이며, 쓰기 메소드를 가진 객체이다. 기본값은 sys.stdout이다.

  • flush는 선택적이며, 부울 값인데 True는 flushed를 False는 buffered를 의미한다. 기본값은 False이다.

이 문제를 풀이하는 데 있어서 객체와 구분자를 제외한 다른 인자들은 필요치 않으므로, 다른 강좌에서 이들을 설명하고자 합니다.

print 함수를 이용하여 name 변수의 값을 여러 방법으로 출력할 수 있는데 다음과 같습니다.

방법 1

print("%s씨는 로또를 사려고 하는군요. 1등 당첨될 확률을 알려드리겠습니다." % (name))

방법 2

print(name, "씨는 로또를 사려고 하는군요. 1등 당첨될 확률을 알려드리겠습니다.")

방법 3

print("{}씨는 로또를 사려고 하는군요. 1등 당첨될 확률을 알려드리겠습니다.".format(name))

방법 4

print(name + "씨는 로또를 사려고 하는군요. 1등 당첨될 확률을 알려드리겠습니다.")

방법 5

print(f"{name}씨는 로또를 사려고 하는군요. 1등 당첨될 확률을 알려드리겠습니다.")

이 중에서 여러분의 입맛에 맞는 방식을 선택하면 됩니다.

여기까지 하셨다면, 이 문제의 두 번째 줄도 해결하셨습니다. :grin:

세 번째 줄과 네 번째 줄은 동일한 방식으로 작성하므로 한 번에 다루도록 하겠습니다.

세 번째 줄과 네 번째 줄 모두 변수명과 프롬프트만 수정해주시면 되는데, 이번에는 한 가지 사실을 아셔야 합니다.

그것은 바로 input 함수가 반환하는 값이 string 즉, 문자열이라는 것입니다.

그런데 도대체 이게 왜 중요한 것일까요?

이 물음에 대한 답을 찾기 위해 다섯 번째 줄로 가봅시다.

다섯 번째 줄의 두 번째 빈칸에서는 확률을 출력하고 있는데, 이는 세 번째 줄과 네 번째 줄에서 입력한 값들을 이용하여 연산을 진행하고 그 연산 결과를 출력해주면 해결할 수 있습니다.

그런데 문자열끼리 나눗셈을 진행할 수 있을까요?

불가능한 연산입니다.

문자열을 나눈다니요…

그렇기 때문에 우리는 input 함수에서 반환한 값을 형 변환해줘야 합니다.

즉, 기존 str 자료형을 숫자로 말이죠.

파이썬에서 형 변환을 하기 위해서는 다음의 형태로 작성하시면 됩니다.

Type Casting Form

type()
  • 여기서 type은 자료형을 의미합니다. 즉 소괄호 안에 있는 값을 type에 지정한 자료형으로 변환하라는 의미입니다.

이것을 input에 활용해보면 다음과 같습니다.

Type Casting Application

type(input(prompt))

이렇게 작성을 하시면 input으로부터 반환된 값이 type에 지정한 자료형으로 변환이 됩니다.

마지막으로 변환된 값을 변수에 넣어주기만 하면 되겠죠?

Final Type Casting Application

variable = type(input(prompt))

설명한 내용을 바탕으로 세 번째 줄을 작성하면,

total_number_count = int(input('전체 숫자의 갯수는 몇개입니까?'))
  • type은 int로 작성을 하였는데, 갯수는 소수점이 없는 정수이기 때문입니다.

  • 변수명은 꼭 total_number_count가 아니어도 되지만, 의미있는 이름으로 지어주세요. :blush:

마찬가지로 네 번째 줄 역시,

all_match_count = int(input('1등 당첨되기 위해 모두 맞아야 하는 숫자는 몇개인가요?'))
  • 이것 역시 들어맞는 수가 소수점이 없는 정수이기 때문에 type을 int로 작성하였습니다.

  • 변수명은 꼭 all_match_count가 아니어도 되지만, 의미있는 이름으로 지어주세요. :blush:

여기까지 하셨다면, 이 문제의 네 번째 줄까지 모두 해결하셨습니다. :clap::clap:

다섯 번째 줄로 넘어가봅시다.

이것 역시 두 번째 줄과 동일한 방식으로 작성을 해주시면 됩니다.

단, 이번에는 확률을 구하는 식을 작성해주고, 필요한 경우 서식문자까지 추가해주면 되겠군요.

방법 1

print("%s씨가 로또 1장을 샀을 때 1등에 당첨될 확률은 %f%%입니다." % (name, float(all_match_count)/total_number_count*100))
  • all_match_count 변수를 float로 형 변환을 시켜준 이유는 all_match_count와 total_number_count가 모두 정수형이기 때문에 나눗셈 연산의 결과가 정수형으로 나오기 때문입니다. 즉, 소수점 아래의 숫자들이 모두 날아가 버리는 것이죠. 그렇기에 all_match_count나 total_number_count 중 하나를 float로 형 변환을 해주게 되면 나눗셈 연산을 진행할 때 인터프리터가 float로 명시적 형 변환한 변수 외의 기존의 정수형 변수를 float로 자동 형 변환하여 나눗셈 연산의 결과가 float형이 될 수 있습니다. 즉, 소수점 아래의 숫자들이 보존될 수 있는 것이죠.

  • 계산 결과가 실수이므로 서식문자 %f를 사용하였으며, 출력을 위한 %와 서식문자 앞의 %를 interpreter가 동일한 것으로 간주하기 때문에 %를 단순히 출력할 때에는 %를 두 번 작성하여야 합니다. 즉, %%

방법 2

print(name, "씨가 로또 1장을 샀을 때 1등에 당첨될 확률은", float(all_match_count)/total_number_count*100, "%입니다.")

방법 3

print("{}씨가 로또 1장을 샀을 때 1등에 당첨될 확률은 {}%입니다.".format(name, float(all_match_count)/total_number_count*100))

방법 4

print(name + "씨가 로또 1장을 샀을 때 1등에 당첨될 확률은 " + str(float(all_match_count)/total_number_count*100) + "%입니다.")
  • 이번에는 str로 형 변환을 해주었는데, 왜 이렇게 할 수 밖에 없었을까요? 왜냐하면 문자열과 문자열 사이의 +는 문자열끼리의 결합을 의미하는 데, str로 형 변환을 하지 않았을 경우 float 즉, 실수와 문자열에 대해서 + 연산을 진행한다는 것은 인터프리터 입장에서는 이해할 수 없었을 것입니다. 그렇기에 우리는 다시 한번 str로 형 변환을 진행하여 인터프리터가 + 연산의 의미를 이해할 수 있도록 해주어야 합니다.

방법 5

print(f"{name}씨가 로또 1장을 샀을 때 1등에 당첨될 확률은 {float(all_match_count)/total_number_count*100}%입니다.")

부족한 제 글 읽어주셔서 감사드립니다.

코드의 잘못된 부분이나, 궁금한 점이 있으시다면 댓글 남겨주시면 감사드리겠습니다.

댓글남기기