본문으로 건너뛰기

단원 연습 문제

파이썬 목차조건문제 12개

4단원 '조건'의 네 레슨에서 9문제를 내고, 1~3단원에서 3문제를 섞었습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 출력을 쓰는 문제는 빈칸과 줄바꿈까지 종이에 끝까지 쓴 뒤 정답을 펼치세요. 줄 수를 알려 주지 않는 문제는 마지막 줄까지 다 씁니다. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.

한 번에 다 풀 필요는 없습니다. 문제 1~10은 폰으로도 풀 수 있고(약 30분), 끝의 만들어 보기 둘은 컴퓨터에서 직접 돌려 봅니다. 이 단원을 건너뛰어도 되는지 보려면 문제 1 · 5 · 7 · 9 넷을 먼저 풀어 보세요(약 10분). 건너뛸지 볼 때는 힌트를 펴지 않고 풉니다. 힌트를 펴고 맞힌 문제나 짐작으로 고른 문제는 틀린 것으로 치고 그 레슨을 봅니다. 모두 맞으면 이 단원 레슨은 건너뛰고, 틀린 문제가 있으면 그 정답 끝의 레슨만 봅니다. 끝의 만들어 보기 둘은 골라서 풉니다.

끝의 두 문제는 프로그램을 직접 만들어 봅니다. 컴퓨터가 있으면 저장해 돌려 맞춰 보고, 폰으로만 본다면 문제에 적힌 값으로 내 코드를 한 줄씩 따라가 나와야 할 화면과 맞춰 봅니다. 실행 결과는 모두 파이썬 3.15로 돌린 것입니다.

문제 1

카페 여는 시각과 지금 시각을 글자로 받아 두었습니다. 무엇이 찍힐까요? 세 줄을 글자 그대로 쓰세요.

now = '8'
noon = '12'
print(now < noon)
print(int(now) < int(noon))
print(now == 8)
힌트

1·2번 줄의 값에 따옴표가 있는지 보고, 줄마다 무엇과 무엇을 견주는지 보세요.

정답
실행 결과
False
True
False
  • 3번 줄: 글자끼리라 첫 글자 '8'과 '1'을 견줍니다. '1'이 앞이라 '8'이 더 커서 False입니다.
  • 4번 줄: int()로 만든 수 8과 12를 견주어 True입니다.
  • 5번 줄: 글자 '8'과 수 8은 같을 수 없어 False입니다.

흔한 오답은 첫 줄의 True입니다. 따옴표 안의 수를 수로 견준 것입니다(문자열과 수를 가리지 않는 생각). 셋째 줄을 True로 쓴 것도 같은 생각입니다.

다시 볼 레슨: 참과 거짓, 비교

문제 2

쿠키 재고가 다 팔렸는지 표시하려 합니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.

stock = 3
sold_out = stock == 0
stock = 0
print(sold_out)
print(stock == 0)
힌트

2번 줄이 실행되는 그때 stock이 어느 값에 붙어 있는지 보세요.

정답
실행 결과
False
True
  • 2번 줄: 오른쪽 stock == 0이 그때의 값으로 3 == 0, 곧 False로 접히고 sold_out이 그 값에 붙습니다.
  • 3번 줄: stock만 0에 다시 붙습니다. sold_out은 다시 계산되지 않습니다.
  • 5번 줄: 지금 stock은 0이라 0 == 0을 견주어 True를 찍습니다.

흔한 오답은 첫 줄의 True입니다. sold_out이 stock == 0이라는 식을 저장해 두었다가 찍을 때 다시 견준다고 본 것입니다(식이 저장된다는 생각). 비교식도 그 줄이 실행될 때 한 번 계산되어 값 하나로 접힙니다(규칙 2).

다시 볼 레슨: 참과 거짓, 비교 · 변수: 값에 이름 붙이기

문제 3

아파트 동·호수 'A-305'에서 층을 꺼내 견줍니다. 무엇이 찍힐까요? 세 줄을 글자 그대로 쓰세요.

room = 'A-305'
floor = room[2:3]
print(floor)
print(floor == '3')
print(floor == 3)
힌트

다섯 글자에 0부터 번호를 적어 보세요.

정답
실행 결과
3
True
False
  • 2번 줄: [2:3]은 2번 자리 '3' 한 글자입니다. 끝 번호 3의 '0'은 들지 않습니다. floor가 글자 '3'에 붙습니다.
  • 4번 줄: 글자 '3'과 글자 '3'이 같아 True입니다.
  • 5번 줄: 글자 '3'과 수 3은 같을 수 없어 False입니다.

흔한 오답은 첫 줄의 30입니다. 끝 번호의 글자도 든다고 본 것입니다(끝도 든다는 생각). 그러면 둘째 줄도 False로 쓰게 됩니다. 셋째 줄을 True로 쓰면 따옴표 안의 수를 수로 본 것입니다(문자열과 수를 가리지 않는 생각).

다시 볼 레슨: 인덱스와 자르기 · 참과 거짓, 비교

문제 4

독서 앱입니다. 오늘 읽은 쪽수가 30쪽 이상이면 목표를 채웠어요를, 아니면 조금만 더 읽어요를 찍고, 어느 쪽이든 마지막에 기록했습니다를 찍으려 합니다. 42쪽이면 첫째 화면, 18쪽이면 둘째 화면이 나와야 합니다.

목표를 채웠어요
기록했습니다
조금만 더 읽어요
기록했습니다

아래 줄 ㉠~㉥ 가운데 다섯 줄을 뼈대 코드의 '2. 갈래마다 할 일'과 '3. 갈래 뒤 공통' 아래에 놓으세요. 한 줄은 쓰지 않습니다. 들여쓰기는 지웠습니다. 줄마다 들여쓰기 칸 수(0 또는 4)도 함께 쓰세요.

㉠ print('기록했습니다')
㉡ else:
㉢ print('목표를 채웠어요')
㉣ if done
㉤ print('조금만 더 읽어요')
㉥ if done:
pages = 42
# 1. 조건 세우기
done = pages >= 30
# 2. 갈래마다 할 일
# 3. 갈래 뒤 공통
힌트

'2. 갈래마다 할 일' — 갈래 머리(if·else)를 위에서부터 놓고, 머리마다 그 갈래에서 찍을 줄을 붙입니다.

놓은 뒤 물음

㉠의 들여쓰기 칸 수를 그렇게 정한 까닭은 무엇일까요?

  • ① 덩어리 밖에 두어야, 어느 갈래로 가든 마지막에 한 번 찍히기 때문
  • ② 덩어리 안에 두면, if가 그 덩어리를 되풀이해 두 번 찍히기 때문
  • ③ 들여쓰기는 보기 좋게 맞출 뿐이라, 몇 칸에 두어도 결과가 같기 때문
정답

㉥(0) ㉢(4) ㉡(0) ㉤(4) ㉠(0) 차례이고, 까닭은 ①입니다. 쓰지 않는 줄은 콜론이 빠진 ㉣입니다.

pages = 42
# 1. 조건 세우기
done = pages >= 30
# 2. 갈래마다 할 일
if done:
    print('목표를 채웠어요')
else:
    print('조금만 더 읽어요')
# 3. 갈래 뒤 공통
print('기록했습니다')
실행 결과
목표를 채웠어요
기록했습니다
  • 3번 줄: 42 >= 30이 참이라 done이 True에 붙습니다.
  • 5·6번 줄: done이 True라 if 덩어리를 한 번 실행해 목표를 채웠어요를 찍고, else 덩어리는 건너뜁니다.
  • 10번 줄: 들여 쓰지 않은 줄이라 덩어리 밖입니다. 갈래와 상관없이 기록했습니다를 찍습니다.

서로 바꿔도 되는 줄은 없습니다. ㉣을 ㉥ 자리에 쓰면 실행하기 전에 SyntaxError: expected ':'⁠로 멈춥니다.

  • ② if가 덩어리를 되풀이한다고 봤습니다. if는 한 번 고를 뿐이고, ㉠을 4칸에 두면 else 덩어리에 들어가 18쪽일 때만 찍힙니다.
  • ③ 들여쓰기를 꾸밈으로 봤습니다(들여쓰기는 꾸밈이라는 생각). 들여 쓴 줄만 덩어리에 들고, 덩어리는 그 갈래가 골라졌을 때만 실행됩니다(규칙 4).

다시 볼 레슨: if와 else · elif로 여러 갈래

문제 5

도장 10개를 모으면 무료 음료를 줍니다. 무엇이 찍힐까요? 마지막 줄까지 글자 그대로 쓰세요.

stamps = 10
if stamps >= 10:
    stamps = stamps - 10
    print('무료 음료')
if stamps < 10:
    print('도장 더 모으기')
print(stamps)
힌트

5번 줄의 if에 왔을 때 stamps가 어느 값에 붙어 있는지 보세요.

정답

모두 3줄입니다.

실행 결과
무료 음료
도장 더 모으기
0
  • 2~4번 줄: 10 >= 10이 True라 덩어리를 실행해 stamps가 0에 다시 붙고 무료 음료를 찍습니다.
  • 5·6번 줄: 따로 선 if라 이 줄에 왔을 때의 값으로 조건을 새로 계산합니다. 0 < 10이 True라 도장 더 모으기도 찍습니다.
  • 7번 줄: stamps가 붙은 0을 찍습니다.

흔한 오답은 둘째 줄을 빼고 두 줄만 쓰는 것입니다. 첫 if가 실행됐으니 둘째 if는 건너뛴다고, 곧 둘째 if를 첫 if의 else처럼 본 것입니다(else를 if 하나 더로 보는 생각과 한 짝). 따로 선 if는 그 줄에 왔을 때 조건을 새로 계산합니다(규칙 4).

다시 볼 레슨: if와 else · elif로 여러 갈래

문제 6

주문을 받는 코드에서 3번 줄 끝의 콜론을 빠뜨렸습니다. 이 코드를 실행하면 어떻게 될까요? 알맞은 것을 고르세요.

print('주문 시작')
total = 12000
if total >= 10000
    print('쿠키 증정')
print('끝')
  • ① 주문 시작을 찍은 뒤 3번 줄에서 SyntaxError로 멈춘다
  • ② 주문 시작과 끝을 찍고, 3·4번 줄은 건너뛴다
  • ③ 아무것도 찍지 않고 SyntaxError로 멈춘다
힌트

콜론이 빠진 것이 쓰는 법(문법)의 잘못인지, 실행해 봐야 아는 잘못인지 가르세요.

정답

③ — 실행 결과는 이렇습니다.

실행 결과
  File "main.py", line 3    if total >= 10000                     ^SyntaxError: expected ':'

콜론이 빠진 것은 쓰는 법(문법)에 어긋난 것이라, 파이썬은 실행하기 전에 파일 전체를 보다가 찾아냅니다. 그래서 1번 줄의 주문 시작도 찍히지 않습니다. 메시지에 Traceback 줄이 없는 것도 한 줄도 실행하지 않았다는 표시입니다.

  • ① 문법 오류를 실행 중 오류처럼 봤습니다. 실행 중 오류라면 앞줄이 찍히지만, 문법 오류는 한 줄도 실행하지 않습니다.
  • ② 오류가 난 줄만 건너뛴다고 봤습니다. 오류가 나면 실행은 이어지지 않습니다.

다시 볼 레슨: 오류 메시지 읽기 · if와 else

문제 7

오늘 판 잔 수 n이 0일 때, 매출 won을 잔 수로 나눈 값을 견주는 두 줄입니다. 무엇이 찍힐까요? 마지막 줄까지 쓰고, 오류가 난다고 보면 찍히는 줄 다음에 오류 이름을 쓰세요.

n = 0
won = 12000
print(n == 0 or won / n > 4000)
print(n > 0 and won / n > 4000)
힌트

or와 and의 왼쪽이 각각 무엇으로 접히는지부터 보세요.

정답

모두 2줄입니다.

실행 결과
True
False
  • 3번 줄: 왼쪽 n == 0이 True라 or의 답은 이미 True입니다. 오른쪽 나누기는 계산하지 않습니다.
  • 4번 줄: 왼쪽 n > 0이 False라 and의 답은 이미 False입니다. 오른쪽은 계산하지 않습니다.

흔한 오답은 3번 줄에서 ZeroDivisionError로 멈춘다고 쓰는 것입니다. and·or가 늘 양쪽을 다 계산한다고 본 것입니다(양쪽을 다 계산한다는 생각). 왼쪽만으로 답이 정해지면 오른쪽은 계산하지 않습니다. 나누기를 or의 왼쪽에 두었다면 그 자리에서 ZeroDivisionError로 멈춥니다.

다시 볼 레슨: and·or·not

문제 8

추가 샷을 넣을지 물었더니 답이 ' YES'로 들어왔습니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.

answer = ' YES'
answer.lower()
print(answer == ' yes')
answer = answer.strip()
print(answer == 'YES')
힌트

3번 줄과 5번 줄을 실행할 때 answer가 어느 값에 붙어 있는지 보세요.

정답
실행 결과
False
True
  • 2번 줄: 소문자 새 값 ' yes'를 만들지만 아무 이름도 붙지 않아 버려집니다. answer는 그대로 ' YES'에 붙어 있습니다.
  • 3번 줄: ' YES'와 ' yes'는 대문자와 소문자가 달라 False입니다.
  • 4·5번 줄: 앞 빈칸을 뗀 새 값 'YES'에 answer가 다시 붙고, 'YES'와 같아 True입니다.

흔한 오답은 첫 줄의 True입니다. 메서드를 부르기만 하면 그 문자열이 바뀐다고 본 것입니다. 새 값에 이름을 다시 붙여야 남습니다(규칙 3).

다시 볼 레슨: 문자열 메서드 · 참과 거짓, 비교

문제 9

하고 싶은 일마다 쓸 기호나 낱말을 하나씩 쓰세요. 넷 다 쓴 뒤 정답을 펼치세요.

  • (가) 두 값이 같은지 묻는다
  • (나) 두 값이 다른지 묻는다
  • (다) 위 조건이 모두 거짓일 때, 새 조건 하나를 더 견주는 갈래를 연다
  • (라) 참과 거짓을 뒤집는다
힌트

둘은 비교 기호이고, 둘은 파이썬 낱말입니다.

정답

받는 답: (가) == · (나) != · (다) elif · (라) not

  • 틀리는 꼴 = — (가)에: 이름을 값에 붙이는 대입입니다. 조건 자리에 쓰면 SyntaxError입니다.
  • 틀리는 꼴 else if — (다)에: 파이썬에는 없는 꼴이라 SyntaxError입니다. if로 쓰면 따로 선 조건이라 위 갈래와 상관없이 다시 봅니다.
  • 틀리는 꼴 else — (다)에: 조건 없이 남은 경우를 모두 받는 마지막 갈래입니다.

다시 볼 레슨: 참과 거짓, 비교 · elif로 여러 갈래 · and·or·not

문제 10

택배 요금은 기본 4,000원에, 20kg 이상이면 8,000원, 10kg 이상이면 3,000원을 더합니다(둘 가운데 하나만). 12kg은 요금 7,000원으로 맞게 찍히는데, 25kg을 넣어 보니 요금 12,000원이어야 할 것이 아래처럼 찍혔습니다. 몇 번 줄의 무엇을 고쳐야 할까요? 고친 줄을 쓰세요.

weight = 25
fee = 4000
if weight >= 20:
    fee = fee + 8000
if weight >= 10:
    fee = fee + 3000
print(f'요금 {fee:,}원')
실행 결과
요금 15,000원
힌트

25kg일 때 3번 줄과 5번 줄의 조건이 각각 무엇인지 보세요.

정답

5번 줄의 if를 elif로 고칩니다.

weight = 25
fee = 4000
if weight >= 20:
    fee = fee + 8000
elif weight >= 10:
    fee = fee + 3000
print(f'요금 {fee:,}원')
실행 결과
요금 12,000원

고치기 전에는 5번 줄이 따로 선 if라, 25kg에서 두 조건이 다 참이 되어 8,000원과 3,000원을 둘 다 더했습니다. elif는 위 조건이 거짓일 때만 보므로 둘 가운데 하나만 더합니다. 12kg에서는 3번 줄이 거짓이라 고치기 전후가 같았습니다.

  • 다르게 고쳐도 되는 곳: 5번 줄의 조건에 and weight < 20을 더해도 25kg은 요금 12,000원, 12kg은 요금 7,000원입니다.
  • 흔한 오답은 두 조건의 차례를 바꿔 elif로 잇는 것입니다. 그러면 25kg이 '10kg 이상'에 먼저 걸려 요금 7,000원이 찍힙니다. 서로 감싸는 조건은 좁은 것부터 놓습니다.
  • 4번 줄을 fee + 5000으로 바꿔도 12kg·25kg 모두 맞는 요금이 찍힙니다. 그러나 20kg 이상에서 두 요금을 다 더하는 짜임은 그대로라, 10kg 요금이 바뀌면 20kg 요금도 같이 틀어집니다. 결과만 맞춘 숫자 고치기입니다.

다시 볼 레슨: elif로 여러 갈래 · if와 else

문제 11 (만들어 보기)

주문 금액에 따라 배달비를 고르는 계산기를 만들어 봅니다. 3만 원 이상이면 배달비 0원, 1만 5천 원 이상이면 1,000원, 그 밖에는 3,000원이고, 낼 돈은 주문 금액에 배달비를 더한 것입니다. 30000을 넣으면 이렇게 나와야 합니다.

금액: 30000
배달비 0원
낼 돈 30,000원

15000을 넣으면 이렇게 나와야 합니다.

금액: 15000
배달비 1,000원
낼 돈 16,000원

아래 뼈대에서 1번 줄은 그대로 두고, 주석 셋 아래를 채우세요. 다 쓰면 둘째 값으로도 따라가 보고, 9000도 넣어 봅니다. 9000이면 배달비 3,000원과 낼 돈 12,000원이 나와야 합니다.

total = int(input('금액: '))
# 1. 조건 세우기
# 2. 갈래마다 할 일
# 3. 갈래 뒤 공통넣는 값30000

처음 펼 때 약 6MB를 받습니다.

힌트

30000이 위에서부터 어느 조건에 먼저 걸리는지 보세요. 깃발 둘을 먼저 세우면 갈래가 짧아집니다.

정답

모범 답입니다. 30000을 넣은 결과입니다.

total = int(input('금액: '))
# 1. 조건 세우기
free = total >= 30000
low = total >= 15000
# 2. 갈래마다 할 일
if free:
    fee = 0
elif low:
    fee = 1000
else:
    fee = 3000
# 3. 갈래 뒤 공통
pay = total + fee
print(f'배달비 {fee:,}원')
print(f'낼 돈 {pay:,}원')넣는 값30000
실행 결과
금액: 30000
배달비 0원
낼 돈 30,000원

30000은 30000 >= 30000이 참이라 첫 갈래에서 fee가 0에 붙습니다. 15000을 넣으면 free는 False, low는 True라 fee가 1000에 붙고 pay는 16000입니다. 9000이면 둘 다 False라 else 갈래에서 fee가 3000에 붙습니다.

  • 다르게 써도 되는 곳: 깃발 없이 if total >= 30000:처럼 조건을 바로 써도 됩니다. 낼 돈을 이름 없이 중괄호 안에서 더해도 됩니다. 기본값 fee = 3000을 먼저 두고 넓은 조건부터 if로 덮어써도(if low: 다음 if free:) 세 값 모두 맞습니다. 다만 이 단원은 elif로 한 갈래만 고르는 꼴을 연습합니다.
  • 찍은 화면이 위와 같고 15000과 9000에서도 맞으면 맞습니다.
  • 흔한 오답은 넓은 조건(1만 5천 원 이상)을 위에 두는 것입니다. 30000이 그 갈래에 먼저 걸려 배달비 1,000원이 찍힙니다. 모범 답의 elif를 if로 바꿔도 30000에서 아래 if가 다시 참이 되어 배달비 1,000원입니다. >= 대신 > 기호를 쓰면 30000에서 배달비 1,000원, 15000에서 배달비 3,000원이 찍힙니다.

다시 볼 레슨: elif로 여러 갈래 · if와 else · 참과 거짓, 비교

문제 12 (만들어 보기)

이번에는 빈 데서 씁니다. 놀이기구 앞에서 키와 나이를 물어, 키가 120cm 이상이고 나이가 7세 이상이면 혼자 탈 수 있어요, 아니면 보호자와 함께 타요를 찍고, 어느 쪽이든 마지막에 안전띠를 매요를 찍는 프로그램을 쓰세요. 물을 때 쓰는 글은 '키: '와 '나이: '입니다. 125와 8을 넣으면 이렇게 나와야 합니다.

키: 125
나이: 8
혼자 탈 수 있어요
안전띠를 매요

125와 6을 넣으면 이렇게 나와야 합니다.

키: 125
나이: 6
보호자와 함께 타요
안전띠를 매요

다 쓰면 둘째 값으로도 따라가 보고, 110과 9, 120과 7도 넣어 봅니다. 110과 9는 보호자와 함께 타요, 120과 7은 혼자 탈 수 있어요가 나오고, 마지막 줄은 늘 안전띠를 매요여야 합니다.

힌트

키와 나이를 수로 받는 두 줄을 맨 위에 두고, 하위 목표 셋(1. 조건 세우기 · 2. 갈래마다 할 일 · 3. 갈래 뒤 공통)의 주석을 쓴 뒤 그 아래를 채웁니다.

정답

모범 답입니다. 125와 8을 넣은 결과입니다.

height = int(input('키: '))
age = int(input('나이: '))
# 1. 조건 세우기
tall = height >= 120
old = age >= 7
ok = tall and old
# 2. 갈래마다 할 일
if ok:
    print('혼자 탈 수 있어요')
else:
    print('보호자와 함께 타요')
# 3. 갈래 뒤 공통
print('안전띠를 매요')넣는 값1258
실행 결과
키: 125
나이: 8
혼자 탈 수 있어요
안전띠를 매요

125와 6이면 old가 False라 ok도 False, 110과 9면 tall이 False라 ok도 False입니다. 120과 7이면 120 >= 120과 7 >= 7이 둘 다 True입니다.

  • 다르게 써도 되는 곳: 깃발 없이 if height >= 120 and age >= 7:⁠로 써도 됩니다.
  • 찍은 화면이 위와 같고 나머지 세 시험 값에서도 맞으면 맞습니다.
  • 흔한 오답은 '이고'를 or로 옮기는 것입니다. 그러면 125와 6, 110과 9도 혼자 탈 수 있어요가 찍힙니다. > 기호를 쓰면 120과 7에서 보호자와 함께 타요가 찍힙니다. 안전띠를 매요 줄을 4칸 들여 쓰면 else 덩어리에 들어가, 혼자 탈 수 있을 때는 찍히지 않습니다(들여쓰기는 꾸밈이라는 생각).

다시 볼 레슨: and·or·not · if와 else · 입력은 늘 글자

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로