Python 기초

보초값(sentinel) 사용하기

우리는 반복문을 이용하여 사용자가 입력하는 5개의 정수의 합을 구할 수 있습니다.

하지만 만약 입력될 데이터의 정확한 개수가 불확실하거나 데이터가 너무 많아 개수를 알기가 어려운 경우에는 어떻게 해야 할까요?

이런 경우에는 데이터의 끝에 끝을 알리는 특수한 데이터를 놓으면 됩니다.

프로그램에서는 데이터를 입력하다가 이 특수한 데이터가 나타나면 데이터의 입력을 중단하면 됩니다.

데이터의 끝을 알리는데 사용되는 데이터 값을 보초값(sentinel) 또는 센티널이라고 합니다.

센티널은 일반적인 데이터값에서는 절대 등장할 수 없는 값으로 선택하는 것이 좋습니다.

예를 들어 성적을 입력받아 성적의 평균을 구하는 프로그램이면, 음수나 100보다 큰 값을 센티널로 선택하는 것이 좋습니다.

 

사용자로부터 임의의 개수의 성적을 입력받아 평균을 계산한 후 출력하는 프로그램을 작성해봅시다.

센티널로는 음수의 값을 사용합니다. 즉 음수가 입력되면 반복을 중단합니다.

 

지금까지는 알고리즘을 생각할 필요가 없는 순차 구조만을 사용하였지만 이제는 알고리즘을 고려해야 합니다.

선택과 반복을 이용하여 프로그램을 작성하는 만큼 성적의 평균을 구하는 문제에 대한 알고리즘을 잘 생각해봅시다.

 

알고리즘을 만드는 가장 기초적인 방법은 문제를 한 번에 해결하려 하지 말고 더 작은 크기의 단계들로 분해하는 것입니다.

'성적의 평균을 구한다' 라는 문제를 세분화 시키면

  1. 필요한 변수들을 초기화한다.
  2. 성적을 입력받아 합계를 구하고 성적의 개수를 센다.
  3. 평균을 계산하고 화면에 출력한다.

이렇게 3단계로 나눌 수 있습니다. 아직 각 단계들이 프로그램으로 변환할 정도로 세분화되지 않으므로 더 작은 단계로 분해합시다.

 

먼저 첫 번째 단계인 "필요한 변수들을 초기화한다" 를 보다 상세하게 분해합니다.

  • 합계를 저장하는 변수 sum을 0으로 초기화한다.
  • 성적의 개수를 저장하는 변수 n을 0으로 초기화한다.
  • 정수를 입력받아 저자하는 변수 score를 0으로 초기화한다.

 

두 번째 단계인 "성적을 입력받아 합계를 구하고 개수를 센다"를 보다 상세하게 분해합니다.

  • while (성적이 0 이상이면)
  •     사용자로부터 성적을 읽어 score에 저장합니다.
  •     if (성적이 양수이면)
  •         sum에 이 점수를 누적합니다.
  •         n을 하나 증가합니다.

 

마지막 단계 "평균을 계산하고 화면에 출력한다"를 보다 상세하게 분해합니다.

  • sum을 n으로 나누어 average에 저장합니다.
  • average를 화면에 출력합니다.

 

자, 이제 프로그램으로 변환할 정도로 상세하게 분해하였습니다. 위의 의사 코드 문장을 프로그래밍 언어로 변환하면 아래와 같습니다.

# while 문을 이용한 성적의 평균 구하기 프로그램
# 필요한 변수들을 초기화합니다.
n = 0
sum = 0
score = 0

print("종료하려면 음수를 입력하세요.")

# score가 0 이상이면 반복합니다.
# 성적을 입력받아 합계를 구하고 학생 수를 셉니다.
while score >= 0:
	score = int(input("성적을 입력하세요 : "))
	if score > 0:
		sum += score
		n += 1

# 평균을 계산하고 화면에 출력합니다.
if n > 0:
	average = sum / n

print("성적의 평균은 %f입니다." % average)

 

<실행 결과>

성적을 입력하세요 : 10
성적을 입력하세요 : 20
성적을 입력하세요 : 30
성적을 입력하세요 : -1
성적의 평균은 20.000000입니다.

 

도전 과제

봉민이는 다음 학기 MT 때 술게임 중 숫자 맞추기 게임을 1부터 100까지로 한정하여 최대 5번 이내에 맞추는 게임을 준비하고 있습니다.

이를 연습하기 위해 시뮬레이션 프로그램을 작성한다고 했을 때 아래와 같은 실행 결과가 나오도록 프로그램을 작성해봅시다.

 

<실행 결과>

  • 결과를 맞췄을 때
1부터 100 사이의 숫자를 맞추세요.
숫자를 입력하세요 : 50
높음! 더 낮은 숫자를 입력하세요.
숫자를 입력하세요 : 25
높음! 더 낮은 숫자를 입력하세요.
숫자를 입력하세요 : 12
높음! 더 낮은 숫자를 입력하세요.
숫자를 입력하세요 : 6
정답입니다! 시도 횟수 =  4
  • 결과를 틀렸을 때
1부터 100 사이의 숫자를 맞추세요.
숫자를 입력하세요 : 50
낮음! 더 높은 숫자를 입력하세요.
숫자를 입력하세요 : 75
낮음! 더 높은 숫자를 입력하세요.
숫자를 입력하세요 : 87
낮음! 더 높은 숫자를 입력하세요.
숫자를 입력하세요 : 95
높음! 더 낮은 숫자를 입력하세요.
숫자를 입력하세요 : 90
높음! 더 낮은 숫자를 입력하세요.
오답입니다! 정답은  89

 

HINT

프로그램의 알고리즘은 다음과 같습니다.

while 시도횟수 < 5
    사용자로부터 숫자를 guess로 입력받습니다.
    시도횟수를 증가합니다.

    if (guess < answer)
        숫자가 낮다고 출력합니다.
    if (guess > answer)
        숫자가 높다고 출력합니다.
    if (guess == answer)
        break

만약 정답일 경우 축하 메세지와 시도횟수를 출력합니다.
만약 시도횟수 5회를 넘길 경우 알림 메시지와 정답을 출력합니다.

 

랜덤한 숫자를 출력하는 코드는 아래와 같습니다.

import random

tries = 0
number = random.randint(1, 100)

print(number)