더북(TheBook)

6.2.3 리스트로 간단한 프로그램 만들기

이번에는 익숙한 게임을 리스트를 사용해 프로그램으로 구현해 보겠습니다. 지하철 게임이라는 놀이가 있습니다. 술래가 호선을 지정하면 오른쪽으로 돌아가며 해당 호선에 있는 역을 차례대로 말합니다. 틀린 역을 말하거나 박자가 늦으면 벌칙을 받는 게임이죠. 예를 들어, 술래가 ‘2호선’을 외치면 2호선에 포함된 역만 말해야 합니다. 2호선이 아닌 다른 호선에 있는 역을 말하면 벌칙을 받습니다.

실제로는 모든 호선을 포함하지만, 여기서는 간단하게 서울 지하철 2호선을 대상으로 지하철 게임을 만들어 보겠습니다. 코드를 작성하기 전에 프로그램을 구상해 봅시다. 우선 역 이름을 입력받아야 합니다. 입력받은 역 이름이 2호선에 있으면 다음 역 이름을 입력받습니다. 입력받은 역 이름이 2호선에 없으면 게임을 멈춰야 합니다. 정리하면, 역 이름을 입력받는 것이 반복되고 입력받은 역 이름이 2호선이 아니라면 반복을 중단하는 것이죠. 이럴 때는 반복문과 반복문을 탈출하는 break를 사용하면 됩니다. 이해하기 쉽게 순서도로 표현해 보겠습니다.

 

두 순서도는 동일하게 동작합니다. 왼쪽 순서도부터 봅시다. 입력받은 역이 2호선에 있으면 게임을 계속해야 하므로 ‘예’ 화살표를 따라가서 다시 입력받는 명령어를 수행합니다. 이때 ‘예’ 화살표는 반복문을 의미합니다. 입력받은 역이 2호선에 없으면 틀렸으므로 ‘아니요’ 화살표를 따라가서 프로그램을 종료합니다. 눈치챘겠지만 두 갈래로 갈라지는 초록색 상자는 조건문을 의미합니다. ‘입력받은 역 이름이 2호선에 있는가?’가 조건이 되겠죠.

오른쪽 순서도는 왼쪽 순서도에서 조건문의 조건을 조금 변경했습니다. 조건이 ‘입력받은 역 이름이 2호선에 있는가?’에서 ‘입력받은 역 이름이 2호선에 없는가?’로 바뀌었습니다. 조건이 변경되면 ‘예’와 ‘아니요’ 부분도 변경됩니다. 여기에서는 오른쪽 순서도를 기준으로 프로그램을 작성하겠습니다.

졔졔쌤의 조언

순서도는 원래 사용하는 모양이 따로 있지만, 여기서는 간단하게 표현했습니다. 순서도는 프로그램의 흐름을 도식화한 것이고, 요소들을 화살표로 연결해 순서를 나타낸다고 알면 됩니다.

컴퓨터는 입력받은 역 이름이 2호선에 없는지를 어떻게 판단할까요? 2호선에는 총 43개의 역이 있습니다(지선을 제외하고 본선만 센 숫자입니다). 43개 역 이름을 하나의 리스트로 묶으면 입력받은 역이 리스트에 없는지 not in으로 판단할 수 있습니다. 앞의 순서도에서 반복문과 조건문인 부분을 코드로 표현하면 다음과 같습니다.

 

그림을 참고해 2호선 지하철 게임을 작성해 보겠습니다. 먼저 2호선 43개 역 이름을 담은 리스트를 만듭니다. 리스트명은 line2로 하고 43개 역 이름을 리스트에 넣은 후 리스트 길이를 출력해 봅시다.

line2 = ['성수', '뚝섬', '한양대', '왕십리', '상왕십리', '신당', '동대문역사문화공원','을지로4가', '을지로3가', '을지로입구', '시청', '충정로', '아현', '이대', '신촌', '홍대입구', '합정', '당산', '영등포구청', '문래', '신도림', '대림', '구로디지털단지', '신대방', '신림', '봉천', '서울대입구', '낙성대', '사당', '방배', '서초', '교대', '강남', '역삼', '선릉', '삼성', '종합운동장', '잠실새내', '잠실', '잠실나루', '강변', '구의', '건대입구']
print(len(line2))
실행결과
4

졔졔쌤의 조언

43개 역을 직접 입력하기 어려우면 이 책의 소스 코드에서 해당 부분만 복사해서 사용해도 됩니다. 또는 간략하게 몇 개의 역만 리스트로 작성해도 됩니다. 실습을 위한 프로그램이므로 완벽하게 만들 필요는 없습니다.

line2 리스트의 길이가 43이라고 나옵니다. 제대로 입력됐네요.

순서도를 보면 반복문 안에서 역 이름을 입력받고 해당 역이 2호선 안에 없는지를 확인합니다. 반복문을 사용하려면 반복 횟수를 정해야 하는데 여기서는 10회를 반복한다고 가정하겠습니다. 역 이름을 입력받아야 하므로 반복문 내부에 input()이 있어야 합니다. 그리고 input() 값이 line2 리스트에 없으면 프로그램을 종료합니다.

코드로 작성하면 다음과 같습니다.

print('지하철~ ' * 4)
# 10번 반복한다고 가정
for i in range(10):
    station = input()
    if station not in line2:
        print('땡! 해당 역은 2호선이 아닙니다!')
        break

input()으로 입력받은 값을 station 변수에 저장하고 station 값이 line2 리스트에 없으면 반복을 멈추도록 break를 넣습니다. 입력이 틀리면 프로그램을 종료하기 전에 입력이 틀렸다는 메시지도 출력합니다. 프로그램을 실행해 다양한 값을 넣어 봅시다.

실행결과
지하철~ 지하철~ 지하철~ 지하철~ 
강남 
합정 
역삼 
낙성대 
홍대
땡! 해당 역은 2호선이 아닙니다!

단순하긴 하지만 실제 놀이를 파이썬으로 작성해 봤습니다. 본인이 아는 다른 놀이로도 한번 작성해 보세요.

1분 퀴즈

3 다음 코드에 대한 설명으로 옳지 않은 것을 고르세요.

import random

score = []
A = []
B = []
C = []

for i in range(30):
    score.append(random.randint(0, 100))
for i in range(len(score)):
    if score[i] > 80:
        A.append(score[i])
    elif score[i] > 40:
        B.append(score[i])
    else:
        C.append(score[i])

score에는 총 30개의 무작위 정수가 저장된다.

score에서 80을 초과하는 숫자는 A 리스트에 저장된다.

score에 숫자 40이 있다면 C 리스트에 저장된다.

A, B, C 리스트 중 하나에 저장된 숫자는 score 리스트에서 삭제된다.

⑤ 두 번째 반복문은 다음과 같이 바꿔도 결과가 동일하다.

for s in score:
    if s > 80:
        A.append(s)
    elif score[i] > 40:
        B.append(s)
    else:
        C.append(s)

정답 및 해설

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.