본문으로 건너뛰기

단원 1~5 섞어 풀기

파이썬 목차반복문제 12개

하루 지나 풀면 더 오래 남습니다. 1~5단원을 마친 다음 날 풀어 보세요. 1~5단원에서 골고루 12문제를 섞었고, 어느 레슨의 문제인지는 정답을 펼쳐야 보입니다. 출력을 쓰는 문제는 빈칸과 줄바꿈까지 종이에 끝까지 쓴 뒤 정답을 펼치세요. 줄 수를 알려 주지 않는 문제는 마지막 줄까지 다 씁니다. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.

한 번에 다 풀 필요는 없습니다. 문제 1~11은 폰으로도 풀 수 있고(약 30분), 끝의 만들어 보기 하나는 컴퓨터에서 직접 돌려 봅니다.

5번과 11번은 긴 코드입니다. 추적 표(줄 · 바뀐 이름 · 값 · 출력)를 그리며 따라가세요. 마지막 문제는 작은 계산기를 빈 데서 만들어 봅니다. 컴퓨터가 있으면 저장해 돌려 맞춰 보고, 폰으로만 본다면 문제에 적힌 값으로 내 코드를 한 줄씩 따라가 맞춰 봅니다. 실행 결과는 모두 파이썬 3.15로 돌린 것입니다.

문제 1

두 수를 물어 견주고 잇습니다. 7과 10을 넣었습니다. 무엇이 찍힐까요? 넣은 값이 보이는 줄까지 네 줄을 글자 그대로 쓰세요.

a = input('a: ')
b = input('b: ')
print(a > b, int(a) > int(b))
print(a + b)넣는 값710
힌트

1·2번 줄에서 a와 b가 어떤 종류의 값에 붙는지 먼저 정하세요.

정답
실행 결과
a: 7
b: 10
True False
710
  • 1·2번 줄: 친 7과 10으로 글자 '7'과 '10'이 만들어지고, a와 b가 그 값에 붙습니다.
  • 3번 줄: 글자끼리는 첫 글자 '7'과 '1'을 견줘 '7'이 커서 True입니다. int()로 만든 수 7과 10은 7이 작아 False입니다.
  • 4번 줄: 글자끼리 이어 710입니다.

흔한 오답은 셋째 줄의 False False나 넷째 줄의 17입니다. 넣은 수가 수로 들어온다고 본 것입니다(문자열과 수를 가리지 않는 생각). input()은 늘 글자를 돌려줍니다.

다시 볼 레슨: 입력은 늘 글자 · 참과 거짓, 비교

문제 2

무엇이 찍힐까요? 한 줄을 글자 그대로 쓰세요.

a = 10
b = a
a = 20
b = b + a
print(a, b)
힌트

줄마다 a와 b가 어느 값에 붙는지 이름표를 다시 그려 보세요.

정답
실행 결과
20 30
  • 2번 줄: b가 a와 같은 10에 붙습니다.
  • 3번 줄: a만 20에 다시 붙습니다. b는 10에 그대로 붙어 있습니다.
  • 4번 줄: 지금 b의 10과 a의 20을 더한 30에 b가 다시 붙습니다.

흔한 오답은 30 40과 20 40입니다. 30 40은 a에 10과 20이 쌓인다고 본 것입니다(상자 생각). 20 40은 b가 이름 a를 따라 20으로 옮겨 간다고 본 것입니다(따라 옮겨 간다는 생각). 다시 붙이면 옛 연결은 끊기고, 다시 붙인 이름만 옮겨 갑니다(규칙 3).

다시 볼 레슨: 이름표 다시 붙이기

문제 3

무엇이 찍힐까요? 한 줄을 글자 그대로 쓰세요.

x = 10
if x > 5:
    x = x - 5
if x <= 5:
    x = x * 3
print(x)
힌트

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

정답
실행 결과
15
  • 2·3번 줄: 10 > 5가 True라 x가 5에 다시 붙습니다.
  • 4·5번 줄: 따로 선 if라 지금 값 5로 새로 견줍니다. 5 <= 5가 True라 x가 15에 다시 붙습니다.

흔한 오답은 5입니다. 둘째 if를 첫 if의 else처럼 본 것입니다(else를 if 하나 더로 보는 생각과 한 짝). 4번 줄이 else:였다면 5가 찍힙니다.

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

문제 4

무엇이 찍힐까요? 한 줄을 글자 그대로 쓰세요.

a = 3
same = a == 3
a = 4
print(a, same)
힌트

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

정답
실행 결과
4 True
  • 2번 줄: 그때 a가 3이라 a == 3이 True로 접히고, same이 그 값에 붙습니다.
  • 3번 줄: a만 4에 다시 붙습니다. same은 다시 견주지 않습니다.

흔한 오답은 4 False입니다. same이 a == 3이라는 식을 저장해 두었다가 찍을 때 다시 견준다고 본 것입니다(식이 저장된다는 생각). 비교식도 그 줄이 실행될 때 한 번 계산되어 값 하나가 됩니다(규칙 2).

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

문제 5

커피는 한 잔 3,000원인데, 셋째 잔마다 2,000원입니다. 15,000원으로 살 수 있는 만큼 사며 잔 수와 남은 돈을 찍습니다. 무엇이 찍힐까요? 마지막 줄까지 글자 그대로 쓰세요.

money = 15000
cups = 0
while money >= 3000:
    cups = cups + 1
    if cups % 3 == 0:
        money = money - 2000
    else:
        money = money - 3000
    print(cups, money)
힌트

바퀴마다 3번 줄의 조건 → cups → 5번 줄의 조건 → money → 출력 차례로 추적 표에 적습니다.

정답

모두 5줄입니다.

실행 결과
1 12000
2 9000
3 7000
4 4000
5 1000

바퀴마다 한 줄로 줄인 추적 표입니다. 실행되는 줄마다 한 줄씩 쓰면 28줄입니다.

바퀴money >= 3000cupscups % 3 == 0money출력
115000 → True1False120001 12000
212000 → True2False90002 9000
39000 → True3True70003 7000
47000 → True4False40004 4000
54000 → True5False10005 1000
—1000 → False반복 끝

다섯째 바퀴는 4000으로 시작해 조건이 참이라 덩어리로 들어가고, 그 안에서 money가 1000에 붙어도 9번 줄까지 마저 찍습니다.

흔한 오답은 5 1000을 빼고 네 줄만 쓰는 것입니다. money가 3000 아래로 내려가는 순간 반복이 멈춘다고 본 것입니다(조건을 늘 지켜본다는 생각). 셋째 잔의 % 조건을 놓쳐 모두 3,000원씩 빼면 3 6000부터 어긋납니다.

다시 볼 레슨: while과 추적 표 · if와 else · 사칙 계산과 몫·나머지

문제 6

같은 끝 번호 4로 자르기와 range를 씁니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.

s = 'coffee'
print(s[1:4])
for i in range(1, 4):
    print(s[i], end='')
print()
힌트

'coffee'에 0부터 번호를 적고, range(1, 4)가 내주는 수를 적어 보세요.

정답
실행 결과
off
off

2번 줄의 [1:4]는 1·2·3번 'o', 'f', 'f'입니다. 4번 'e'는 들지 않습니다. 3·4번 줄은 바퀴마다 한 줄로 줄인 추적 표입니다.

is[i]출력(줄을 바꾸지 않음)
1'o'o
2'f'f
3'f'f

range(1, 4)가 1, 2, 3을 내주고 end=''라 세 글자가 한 줄에 이어집니다. 5번 줄의 print()가 줄을 바꿉니다.

흔한 오답은 두 줄 다 offe로 쓰는 것입니다. 끝 번호 4도 든다고 본 것입니다(끝도 든다는 생각). 자르기의 끝 번호와 range의 끝 수는 같은 규칙으로 넣지 않습니다. 둘째 줄을 글자마다 따로 쓰면 end=''가 줄바꿈 대신 아무것도 붙이지 않는다는 것을 놓친 것입니다.

다시 볼 레슨: 인덱스와 자르기 · for와 range · print로 출력하기

문제 7

쿠키 7개를 둘이 나눌 때, 한 사람 몫만큼 쿠키 번호를 찍습니다. 무엇이 찍힐까요? 마지막 줄까지 쓰고, 오류가 난다고 보면 찍히는 줄 다음에 오류 이름을 쓰세요.

cookies = 7
each = cookies // 2
for i in range(each):
    print('쿠키', i + 1)
print(cookies / 2)
힌트

2번 줄과 5번 줄의 나누기 기호가 만드는 값의 종류를 먼저 정하세요.

정답

모두 4줄입니다.

실행 결과
쿠키 1
쿠키 2
쿠키 3
3.5

2번 줄의 //는 몫이라 each가 정수 3에 붙습니다. 3·4번 줄은 바퀴마다 한 줄로 줄인 추적 표입니다.

ii + 1출력
01쿠키 1
12쿠키 2
23쿠키 3

5번 줄의 /는 소수점 아래까지 나눠 3.5를 찍습니다.

흔한 오답은 마지막 줄의 3입니다. /가 몫을 낸다고 본 것입니다(/가 몫이라는 생각). 거꾸로 2번 줄에 /를 쓰면 each가 3.5에 붙어, 3번 줄의 range(each)가 TypeError로 멈춥니다. range에는 정수만 넣습니다.

다시 볼 레슨: 사칙 계산과 몫·나머지 · for와 range

문제 8

커피 값을 두 번 찍으려 했습니다. 이 코드를 실행하면 어떻게 될까요? 알맞은 것을 고르세요.

print('커피 두 잔')
price = 4000
for i in range(2):
print(price)
  • ① 커피 두 잔을 찍은 뒤 4번 줄에서 IndentationError로 멈춘다
  • ② 아무것도 찍지 않고 IndentationError로 멈춘다
  • ③ 커피 두 잔을 찍고, 반복이 끝난 뒤 4번 줄이 4000을 한 번 찍는다
  • ④ 커피 두 잔을 찍고, 반복이 두 바퀴를 돌며 4000을 두 번 찍는다
힌트

3번 줄 끝의 콜론 다음에 무엇이 와야 하는지, 4번 줄 앞의 빈칸을 보세요.

정답

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

실행 결과
  File "main.py", line 4    print(price)    ^^^^^IndentationError: expected an indented block after 'for' statement on line 3

for 줄 다음에는 들여 쓴 덩어리가 와야 하는데 4번 줄이 들여 쓰이지 않았습니다. 들여쓰기 오류는 문법 오류의 한 갈래라, 실행하기 전에 찾아내 1번 줄의 커피 두 잔도 찍히지 않습니다. 4번 줄을 4칸 들여 쓰면 커피 두 잔 다음 4000을 두 번 찍습니다.

  • ① 문법 오류를 실행 중 오류처럼 봤습니다. 실행 중 오류라면 앞줄이 찍히지만, 문법 오류는 한 줄도 실행하지 않습니다.
  • ③ 4번 줄을 반복 밖의 줄로 보고 실행이 이어진다고 봤습니다. 덩어리가 없는 for는 쓰는 법에 어긋나 한 줄도 실행되지 않습니다.
  • ④ 들여 쓰지 않아도 for 바로 다음 줄이면 덩어리라고 봤습니다(들여쓰기는 꾸밈이라는 생각). 덩어리는 들여쓰기가 정합니다(규칙 4).

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

문제 9

1부터 5까지 가운데 짝수만 더하며 합을 찍습니다. 무엇이 찍힐까요? 마지막 줄까지 글자 그대로 쓰세요.

total = 0
for n in range(1, 6):
    if n % 2 == 0:
        total = total + n
    print(total)
힌트

5번 줄 print(total)이 어느 덩어리에 드는지 들여쓰기 칸 수로 보세요.

정답

모두 5줄입니다.

실행 결과
0
2
2
6
6

5번 줄은 4칸이라 if 덩어리 밖, for 덩어리 안입니다. 그래서 짝수든 아니든 바퀴마다 한 번 찍습니다. total은 n이 2일 때 2, 4일 때 6에 다시 붙습니다.

nn % 2 == 0total출력
1False00
2True22
3False22
4True66
5False66

흔한 오답은 2와 6 두 줄, 또는 6 한 줄입니다. 앞은 print가 if 덩어리 안이라고, 뒤는 반복 밖이라고 본 것입니다(들여쓰기는 꾸밈이라는 생각). 줄이 드는 덩어리는 들여쓰기 칸 수가 정합니다(규칙 4).

다시 볼 레슨: 합 모으기와 세기 · if와 else

문제 10

낱말 'cocoa'에 든 'c'를 세려 합니다. 무엇이 찍힐까요? 한 줄을 글자 그대로 쓰세요.

count = 0
for ch in 'cocoa':
    if ch == 'c':
        count = 1
print(count)
힌트

4번 줄이 count를 어느 값에 붙이는지 보세요.

정답
실행 결과
1

바퀴마다 한 줄로 줄인 추적 표입니다.

chch == 'c'count
'c'True1
'o'False1
'c'True1
'o'False1
'a'False1

'c'는 0번과 2번에 있어 4번 줄이 두 번 실행되지만, 두 번 다 count를 1에 붙일 뿐입니다. 1에 1을 더하지 않아 5번 줄이 1을 찍습니다.

흔한 오답은 2입니다. 이름이 count라서 알아서 센다고 본 것입니다(이름이 뜻을 정한다는 생각). 세려면 count = count + 1처럼 지금 값에 1을 더하는 식을 씁니다(규칙 6).

다시 볼 레슨: 합 모으기와 세기 · 프로그램은 위에서 아래로

문제 11

9일 가운데 홀수 날에만 그날 번호만큼(1·3·5·7·9km) 달리고, 달린 거리의 합이 10km를 넘는 날 그만둡니다. 무엇이 찍힐까요? 한 줄을 글자 그대로 쓰세요.

total = 0
for day in range(1, 10):
    if day % 2 == 0:
        continue
    total = total + day
    if total > 10:
        break
print(day, total)
힌트

day마다 continue를 만나는지, break를 만나는지 추적 표에 적습니다.

정답
실행 결과
7 16

day마다 한 줄로 줄인 추적 표입니다. 실행되는 줄마다 한 줄씩 쓰면 28줄입니다.

dayday % 2 == 0한 일totaltotal > 10
1False더하기1False
2Truecontinue1—
3False더하기4False
4Truecontinue4—
5False더하기9False
6Truecontinue9—
7False더하기16True → break

break로 반복이 끝난 뒤에도 day는 마지막에 붙은 7에 그대로 붙어 있어 7 16을 찍습니다.

흔한 오답은 2 1입니다. 2일째의 continue가 반복을 끝낸다고 본 것입니다. continue는 이번 바퀴만 건너뜁니다. 9 25로 쓰면 break도 이번 바퀴만 건너뛴다고 본 것입니다 — break는 반복을 끝냅니다. 10 16으로 쓰면 반복이 끝나면 day가 끝 수 10에 붙는다고 본 것입니다.

다시 볼 레슨: break와 continue · for와 range · 합 모으기와 세기

문제 12 (만들어 보기)

작은 계산기를 빈 데서 만들어 봅니다. 결제 금액을 빈 줄(아무것도 치지 않고 Enter)이 올 때까지 받아 더하고, 합계를 100으로 나눈 몫만큼 포인트를 줍니다. 합계가 5만 원 이상이면 포인트를 두 배로 줍니다. 물을 때 쓰는 글은 '금액: '입니다. 30000, 22000, 10000을 넣고 빈 줄로 끝내면 이렇게 나와야 합니다.

금액: 30000
금액: 22000
금액: 10000
금액: 
합계 62,000원
포인트 1,240점

50000 하나만 넣고 빈 줄로 끝내면 이렇게 나와야 합니다.

금액: 50000
금액: 
합계 50,000원
포인트 1,000점

작은 계산기와 같은 하위 목표 여섯(1. 합을 0으로 · 2. 묻기 · 3. 빈 줄이면 끝 · 4. 수로 바꿔 더하기 · 5. 포인트 정하기 · 6. 쓰기)으로 씁니다. 다 쓰면 둘째 값으로도 따라가 보고, 12000과 8000도 넣어 봅니다. 합계 20,000원과 포인트 200점이 나와야 합니다.

힌트

하위 목표 여섯의 주석을 먼저 쓰고, 금액마다 되풀이할 것만 반복 안에 둡니다.

정답

모범 답입니다. 30000, 22000, 10000과 빈 줄을 넣은 결과입니다. 1번 줄이 '1. 합을 0으로', 3번 줄이 '2. 묻기', 4·5번 줄이 '3. 빈 줄이면 끝', 6번 줄이 '4. 수로 바꿔 더하기', 7~9번 줄이 '5. 포인트 정하기', 10·11번 줄이 '6. 쓰기'입니다.

total = 0
while True:
    text = input('금액: ')
    if text == '':
        break
    total = total + int(text)
point = total // 100
if total >= 50000:
    point = point * 2
print(f'합계 {total:,}원')
print(f'포인트 {point:,}점')넣는 값300002200010000빈 줄
실행 결과
금액: 30000
금액: 22000
금액: 10000
금액: 
합계 62,000원
포인트 1,240점

합계 62000을 100으로 나눈 몫이 620이고, 5만 원 이상이라 두 배인 1240입니다. 50000 하나면 50000 >= 50000이 참이라 500의 두 배 1000입니다.

  • 다르게 써도 되는 곳: 두 배를 if·else로 나눠 point = total // 100 * 2⁠와 point = total // 100으로 써도 됩니다. 7~9번 줄을 반복 안에 넣어 금액마다 합계로 포인트를 다시 정해도 마지막 화면은 같지만, 다 모은 뒤 한 번 할 일은 반복 밖에 두는 것이 작은 계산기의 짜임입니다.
  • 찍은 화면이 위와 같고 다른 두 시험 값에서도 맞으면 맞습니다.
  • 흔한 오답:
    • total / 100으로 나누면 포인트 1,240.0점처럼 실수로 찍힙니다(/가 몫이라는 생각).
    • > 기호를 쓰면 50000 하나에서 포인트 500점이 찍힙니다.
    • 두 배를 반복 안에서 금액마다 쌓으면 5만 원을 넘은 뒤에 넣은 금액마다 다시 두 배가 되어, 셋째 금액을 넣은 뒤 포인트 2,280점이 됩니다. 넣는 금액의 수가 아니라 5만 원을 넘은 뒤에도 금액을 더 넣어야 드러납니다.
    • int()를 빼면 첫 금액에서 TypeError로 멈추고(문자열과 수를 가리지 않는 생각), 빈 줄인지 보기 전에 int(text)를 하면 빈 줄에서 ValueError로 멈춥니다.

다시 볼 레슨: 작은 계산기 만들기 · 사칙 계산과 몫·나머지 · f-문자열로 출력 꾸미기

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

파이썬 목차로