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 줄이 없는 것도 한 줄도 실행하지 않았다는 표시입니다.
- ① 문법 오류를 실행 중 오류처럼 봤습니다. 실행 중 오류라면 앞줄이 찍히지만, 문법 오류는 한 줄도 실행하지 않습니다.
- ② 오류가 난 줄만 건너뛴다고 봤습니다. 오류가 나면 실행은 이어지지 않습니다.
문제 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를 받습니다.
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
견줄 시험 값
input()마다 위에서부터 한 줄씩 들어갑니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 넣은 값 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.
힌트
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 · 입력은 늘 글자