6단원 '리스트와 튜플'의 여덟 레슨에서 9문제를 내고, 3~5단원에서 3문제를 섞었습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 출력을 쓰는 문제는 빈칸과 줄바꿈까지 종이에 끝까지 쓴 뒤 정답을 펼치세요. 리스트는 파이썬이 찍는 꼴 그대로(쉼표 뒤 빈칸 · 작은따옴표) 씁니다. 줄 수를 알려 주지 않는 문제는 마지막 줄까지 다 씁니다. 이름 둘이 한 리스트를 가리키는 코드는 이름표를 그리며 따라가면 덜 틀립니다. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.
한 번에 다 풀 필요는 없습니다. 문제 1~10은 폰으로도 풀 수 있고(약 30~40분), 끝의 만들어 보기 둘은 컴퓨터에서 직접 돌려 봅니다. 이 단원을 건너뛰어도 되는지 보려면 문제 1 · 3 · 5 · 6 · 8 · 9 여섯을 먼저 풀어 보세요(약 20분). 건너뛸지 볼 때는 힌트를 펴지 않고 풉니다. 힌트를 펴고 맞힌 문제나 짐작으로 고른 문제는 틀린 것으로 치고 그 레슨을 봅니다. 모두 맞으면 이 단원 레슨은 건너뛰고, 틀린 문제가 있으면 그 정답 끝의 레슨만 봅니다. 끝의 만들어 보기 둘은 골라서 풉니다.
끝의 두 문제는 프로그램을 직접 만들어 봅니다. 컴퓨터가 있으면 저장해 돌려 맞춰 보고, 폰으로만 본다면 문제에 적힌 값으로 내 코드를 한 줄씩 따라가 나와야 할 화면과 맞춰 봅니다. 실행 결과는 모두 파이썬 3.15로 돌린 것입니다.
문제 1
카페 점원 둘이 같은 주문 목록을 봅니다. 아래 코드의 4번 줄은 무엇을 찍을까요? (가)는 코드 그대로, (나)·(다)는 한 줄을 바꾼 코드입니다. 셋 다 한 줄씩 글자 그대로 쓰세요.
orders = ['빙수', '빵']
staff = orders
staff.append('쿠키')
print(orders)
- (가) 코드 그대로
- (나) 3번 줄을
staff = ['쿠키']로 바꾸면 - (다) 2번 줄을
staff = orders.copy()로 바꾸면
힌트
줄마다 이름표를 그려, 4번 줄에 왔을 때 orders와 staff가 각각 어느 리스트를 가리키는지 봅니다.
정답
(가)는 이렇습니다.
['빙수', '빵', '쿠키']2번 줄 staff = orders는 새 리스트를 만들지 않고, orders가 가리키는 리스트에 이름 staff를 하나 더 붙입니다. 3번 줄이 그 리스트 끝에 '쿠키'를 더하니 orders로 찍어도 보입니다(규칙 3).
(나)는 3번 줄을 바꾼 코드입니다.
orders = ['빙수', '빵']
staff = orders
staff = ['쿠키']
print(orders)['빙수', '빵']3번 줄은 새 리스트 ['쿠키']를 만들고 staff만 그 리스트로 옮겨 붙입니다. 다시 붙이기는 그 이름 하나만 옮기고, orders가 가리키는 리스트는 아무도 바꾸지 않았습니다(규칙 3).
(다)는 2번 줄을 바꾼 코드입니다.
orders = ['빙수', '빵']
staff = orders.copy()
staff.append('쿠키')
print(orders)['빙수', '빵']2번 줄 orders.copy()는 칸 값이 같은 새 리스트를 만들어 돌려주고, staff는 그 사본에 붙습니다. 3번 줄은 사본에만 '쿠키'를 더합니다.
- (가)를
['빙수', '빵']으로 쓰면 staff가 사본을 받았다고 본 것입니다(복사된다는 생각). - (나)를
['쿠키']로 쓰면 staff를 다시 붙일 때 orders도 따라 옮겨 간다고 본 것입니다(따라 옮겨 간다는 생각). - (다)를
['빙수', '빵', '쿠키']로 쓰면copy()도 같은 리스트에 이름만 하나 더 붙인다고 본 것입니다. ['빙수','빵']이나["빙수", "빵"]처럼 쉼표 뒤 빈칸이나 따옴표만 다르게 썼다면, 값은 맞게 따라갔고 파이썬은 쉼표 뒤에 빈칸 하나를 넣고 문자열을 작은따옴표로 찍습니다.
다시 볼 레슨: 리스트와 이름 둘 · 리스트 복사: copy와 이름 더 붙이기
문제 2
시간대마다 들어온 손님 수를 적은 리스트입니다. 무엇이 찍힐까요? 마지막 줄까지 글자 그대로 쓰세요.
guests = [12, 30, 25, 8]
print(guests[1:3])
for i in range(1, 3):
print(guests[i])
힌트
2번 줄의 [1:3]과 3번 줄의 range(1, 3)이 각각 어느 자리 번호를 짚는지 먼저 적어 보세요.
정답
모두 3줄입니다.
[30, 25]
30
25바퀴마다 한 줄로 줄인 추적 표입니다.
| 바퀴 | i | guests[i] | 출력 |
|---|---|---|---|
| 반복 앞(2번 줄) | [30, 25] | ||
| 1 | 1 | 30 | 30 |
| 2 | 2 | 25 | 25 |
guests[1:3]은 1번 칸부터 3번 칸 바로 앞까지, 곧 1번과 2번 칸을 담은 새 리스트입니다. range(1, 3)도 1과 2를 내주고 끝 수 3은 내주지 않습니다. 자리 번호는 0부터라 1번 칸은 둘째 값 30입니다.
흔한 오답은 [30, 25, 8]로 쓰고 마지막에 8까지 쓰는 것입니다. 자르기와 range의 끝도 든다고 본 것입니다(끝도 든다는 생각). 둘 다 끝 번호 바로 앞에서 멈춥니다. [12, 30]·12·30으로 쓰면 첫 칸의 자리 번호가 1이라고 본 것입니다.
다시 볼 레슨: 인덱스와 자르기 · for와 range · 리스트와 이름 둘
문제 3
하고 싶은 일마다 쓸 이름이나 꼴을 하나씩 쓰세요. 넷 다 쓴 뒤 정답을 펼치세요.
- (가) 리스트 끝에 값 하나를 더한다
- (나) 받은 리스트에서 값을 하나씩 꺼내 리스트 끝에 더한다
- (다) 처음 리스트는 그대로 두고, 작은 것부터 놓은 새 리스트를 돌려준다
- (라) 값 4000 하나만 든 튜플을 쓴다
힌트
(가)·(나)는 같은 표에 나란히 있던 리스트 메서드 둘입니다. (다)는 정렬하는 두 이름 가운데 하나이고, (라)는 튜플을 만드는 기호를 떠올려 보세요.
정답
받는 답: (가) append · (나) extend · (다) sorted · (라) (4000,)
- 같은 답으로 치는 꼴: 괄호까지 쓴
append()·extend()·sorted(), 넘길 값까지 쓴sorted(prices). (라)를 괄호 없이 쓴4000,도 값 하나짜리 튜플입니다. - 틀리는 꼴
extend— (가)에,append— (나)에: 둘이 뒤바뀐 것입니다.append()는 받은 값 하나를 통째로 한 칸에 더하고,extend()는 받은 리스트에서 값을 하나씩 꺼내 더합니다. - 틀리는 꼴
sort— (다)에:.sort()는 처음 리스트를 제자리에서 정렬하고None을 돌려줍니다. - 틀리는 꼴
(4000)— (라)에: 이 괄호는(1 + 2) * 3의 괄호처럼 계산을 묶을 뿐이라 수 4000입니다. 튜플을 만드는 것은 쉼표입니다.
다시 볼 레슨: 리스트를 제자리에서 바꾸기 · 정렬: sort와 sorted · 튜플: 묶고 풀기
문제 4
카페 메뉴판에 영어 이름을 적습니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
word = 'latte'
word.upper()
names = [word]
names.append('soda')
print(word)
print(names)
힌트
2번 줄과 4번 줄은 둘 다 메서드를 부르기만 한 줄입니다. 줄마다 word와 names가 어느 값을 가리키는지 그려 봅니다.
정답
latte
['latte', 'soda']2번 줄 word.upper()는 대문자로 바꾼 새 문자열 'LATTE'를 만들지만, 그 값에 이름을 붙이지 않아 word는 'latte'에 그대로 붙어 있습니다. 4번 줄 names.append('soda')는 names가 가리키는 리스트를 제자리에서 바꿉니다.
- 첫 줄을
LATTE로 쓰면 메서드를 부르기만 해도 문자열이 바뀐다고 본 것입니다. 그렇게 보면 둘째 줄도['LATTE', 'soda']가 됩니다. 문자열 메서드는 새 문자열을 만들어 돌려줄 뿐이라, 쓰려면word = word.upper()처럼 이름을 다시 붙입니다(규칙 3). - 둘째 줄을
['latte']로 쓰면append()도 문자열 메서드처럼 새 값을 만든다고 본 것입니다. 리스트를 바꾸는 메서드는 그 리스트를 제자리에서 바꾸고None을 돌려줍니다(규칙 3).
다시 볼 레슨: 문자열 메서드 · 리스트를 제자리에서 바꾸기
문제 5
독서 앱입니다. 날마다 읽은 쪽수 가운데 30쪽 넘게 읽은 날의 쪽수만 새 리스트에 골라 담고, 다 고른 뒤 한 번 찍으려 합니다. 이렇게 나와야 합니다.
[40, 35]
아래 줄 ㉠~㉥ 가운데 다섯 줄을 뼈대 코드의 주석 아래에 놓으세요. 한 줄은 쓰지 않습니다. 들여쓰기는 지웠습니다. 줄마다 들여쓰기 칸 수(0·4·8)도 함께 쓰세요.
㉠ picked.append(page)
㉡ for page in pages:
㉢ print(picked)
㉣ picked = []
㉤ if page > 30:
㉥ picked = picked.append(page)
pages = [12, 40, 35, 8]
# 1. 빈 리스트
# 2. 하나씩 꺼내 (맞으면) 담기
# 3. 끝나고 쓰기
힌트
나와야 할 화면을 보고, 바퀴마다 할 줄과 반복 앞뒤에 한 번만 할 줄을 먼저 가르세요.
놓은 뒤 물음
㉥을 쓰지 않는 까닭은 무엇일까요?
- ① ㉠과 같은 일을 하는 줄이라, 둘 가운데 짧은 ㉠ 하나만 골라 쓰면 되기 때문
- ② ㉥은 담을 때마다 빈 리스트를 새로 만들어, 마지막에 담은 값만 남기기 때문
- ③ ㉥은 picked를
append()가 돌려준None에 다시 붙이기 때문
정답
㉣(0) ㉡(0) ㉤(4) ㉠(8) ㉢(0) 차례이고, 까닭은 ③입니다. 쓰지 않는 줄은 ㉥입니다.
pages = [12, 40, 35, 8]
# 1. 빈 리스트
picked = []
# 2. 하나씩 꺼내 (맞으면) 담기
for page in pages:
if page > 30:
picked.append(page)
# 3. 끝나고 쓰기
print(picked)[40, 35]바퀴마다 한 줄로 줄인 추적 표입니다.
| 바퀴 | page | 조건 page > 30 | picked | 출력 |
|---|---|---|---|---|
| 1 | 12 | False | [] | |
| 2 | 40 | True | [40] | |
| 3 | 35 | True | [40, 35] | |
| 4 | 8 | False | [40, 35] | |
| 반복 뒤(9번 줄) | [40, 35] |
7번 줄은 8칸이라 조건이 참일 때만 담고, 9번 줄은 들여 쓰지 않아 반복이 끝난 뒤 한 번 찍습니다(규칙 4). 서로 바꿔도 되는 줄은 없습니다. ㉢을 4칸에 두면 바퀴마다 찍혀 []부터 네 줄이 나옵니다(들여쓰기는 꾸밈이라는 생각). ㉥을 ㉠ 자리에 쓰면 40을 담은 바퀴에 picked가 None에 붙고, 35를 담으려는 바퀴에서 AttributeError로 멈춥니다.
- ① 리스트 메서드도 문자열 메서드처럼 결과에 이름을 다시 붙여야 한다고 봤습니다.
append()는 리스트를 제자리에서 바꾸고None을 돌려줘, 두 줄은 같은 일을 하지 않습니다. - ② ㉥에는 빈 리스트를 만드는
[]가 없습니다. 바퀴마다 리스트를 비우는 것은 ㉣을 4칸에 둘 때이고, 그러면[]가 찍힙니다.
다시 볼 레슨: 거르기와 바꿔 담기 · 리스트를 제자리에서 바꾸기
문제 6
카페 메뉴판에 올릴 메뉴의 차례를 다룹니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
menu = ['쿠키', '빙수', '라테']
shown = menu
ranked = sorted(menu)
ranked.append('녹차')
menu.sort()
print(shown)
print(ranked)
힌트
줄마다 이름표를 그려, 6번 줄에 왔을 때 리스트가 몇 개이고 이름 셋이 각각 어느 리스트를 가리키는지 봅니다.
정답
['라테', '빙수', '쿠키']
['라테', '빙수', '쿠키', '녹차']| 줄 | ① — menu·shown이 가리킴 | ② — ranked가 가리킴 |
|---|---|---|
| 1·2 | ['쿠키', '빙수', '라테'] | |
| 3 | 그대로 | ['라테', '빙수', '쿠키'] |
| 4 | 그대로 | ['라테', '빙수', '쿠키', '녹차'] |
| 5 | ['라테', '빙수', '쿠키'] | 그대로 |
2번 줄에서 shown이 menu와 같은 리스트 ①에 붙습니다. 3번 줄 sorted(menu)는 정렬한 새 리스트 ②를 돌려주고, 4번 줄은 ②에만 '녹차'를 더합니다. 5번 줄 menu.sort()는 ①을 제자리에서 정렬하므로 shown으로 찍어도 정렬된 차례입니다(규칙 3). ②는 정렬한 뒤에 더한 '녹차'가 맨 뒤에 있습니다.
- 첫 줄을
['쿠키', '빙수', '라테']로 쓰면 shown이 사본을 받아 처음 차례로 남는다고 본 것입니다(복사된다는 생각)..sort()는 ①을 제자리에서 바꾸고, ①에 붙은 이름 모두에서 바뀐 차례가 보입니다(규칙 3). - 두 줄 모두
['녹차', '라테', '빙수', '쿠키']로 쓰면sorted()도 같은 리스트를 정렬해 돌려준다고 본 것입니다.sorted()는 정렬한 새 리스트를 만들어, ranked에 더한 '녹차'는 ①에 들지 않습니다.
다시 볼 레슨: 정렬: sort와 sorted · 리스트와 이름 둘
문제 7
주문 번호표를 글자로 적어 두었습니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
tickets = ['9', '42', '100']
print(sorted(tickets))
print(max(tickets))
힌트
1번 줄 리스트에 든 값이 어떤 종류인지 먼저 보세요.
정답
['100', '42', '9']
9따옴표 안은 글자라서 첫 글자부터 견줍니다. 첫 글자가 '1'·'4'·'9' 차례라 '100'이 가장 앞이고 '9'가 가장 뒤입니다. max()도 같은 차례로 견주어 가장 뒤인 '9'를 돌려주고, print는 문자열 하나를 찍을 때 따옴표를 붙이지 않습니다.
흔한 오답은 ['9', '42', '100']과 100입니다. 따옴표 안의 수도 수로 견준다고 본 것입니다(문자열과 수를 가리지 않는 생각). 수로 견주려면 번호를 따옴표 없는 수로 담습니다. [9, 42, 100]을 정렬하면 [9, 42, 100], 가장 큰 값은 100입니다.
다시 볼 레슨: 참과 거짓, 비교 · 정렬: sort와 sorted · 가장 큰 값 찾기
문제 8
이 코드를 실행하면 어떻게 될까요? 알맞은 것을 고르세요.
a, b = 4, 9
a, b = b, a + b
pair = (a, b)
print(pair)
pair[0] = 0
- ①
(9, 13)을 찍고, 5번 줄이 0번 칸을 0으로 바꾼 뒤 끝난다 - ②
(9, 13)을 찍은 뒤 5번 줄에서TypeError로 멈춘다 - ③
(9, 18)을 찍은 뒤 5번 줄에서TypeError로 멈춘다
힌트
2번 줄의 오른쪽 b, a + b에 그때 a와 b가 붙은 값을 넣어 적어 보고, 5번 줄이 무엇을 바꾸려 하는지 보세요.
정답
② — 실행 결과는 이렇습니다.
(9, 13)Traceback (most recent call last): File "main.py", line 5, in <module> pair[0] = 0 ~~~~^^^TypeError: 'tuple' object does not support item assignment2번 줄은 오른쪽 b, a + b를 먼저 (9, 13)으로 묶은 뒤 풀어서 a를 9에, b를 13에 붙입니다(규칙 2). 4번 줄이 (9, 13)을 찍고, 5번 줄은 튜플의 칸에 대입하려다 멈춥니다. 맨 아래 줄은 '튜플은 칸에 대입하는 것을 지원하지 않는다'는 뜻입니다.
- ① 튜플도 리스트처럼 칸을 바꿀 수 있다고 봤습니다. 튜플은 만든 뒤 바꿀 수 없는 묶음이라, 칸을 바꿔야 하면 리스트로 만듭니다.
- ③ 2번 줄을
a = b다음b = a + b처럼 왼쪽부터 한 이름씩 붙인다고 봤습니다. 그러면 a가 먼저 9에 붙어 b가 18이 됩니다. 오른쪽을 다 계산한 뒤에 붙입니다(규칙 2).
다시 볼 레슨: 튜플: 묶고 풀기
문제 9
시험 점수 셋으로 새 리스트 둘을 만듭니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
scores = [45, 80, 62]
up = [n + 10 for n in scores
if n < 60]
ok = [n >= 60 for n in scores]
print(up)
print(ok)
힌트
두 컴프리헨션을 맨 앞 식 · for · if로 나눠, 같은 일을 하는 for 꼴로 바꿔 읽어 보세요.
정답
[55]
[False, True, True]꺼낸 값마다 한 줄로 줄인 추적 표입니다.
| n | n < 60 | up에 담는 값 | ok에 담는 값 n >= 60 |
|---|---|---|---|
| 45 | True | 55 | False |
| 80 | False | 담지 않음 | True |
| 62 | False | 담지 않음 | True |
2~3번 줄은 n < 60이 참인 45만 골라 맨 앞 식 n + 10의 값 55를 담습니다. 4번 줄은 if가 없어 셋 다 담는데, 담는 값은 맨 앞 식 n >= 60을 계산한 False·True·True입니다.
- 첫 줄을
[55, 80, 62]로 쓰면if가 바꿀 값만 고르고 나머지는 그대로 담는다고 본 것입니다. 조건이 거짓인 값은 새 리스트에 들지 않습니다. - 둘째 줄을
[80, 62]로 쓰면 맨 앞 식이 거르는 자리라고 본 것입니다. 맨 앞 식은 담을 값을 정하고, 거르는 일은for뒤의if가 합니다.
다시 볼 레슨: 리스트 컴프리헨션
문제 10
수영 50m 기록(초) 셋에서 가장 빠른 기록을 찍고, 처음 기록도 적은 차례 그대로 찍으려 합니다. 이렇게 나와야 합니다.
48
[52, 48, 50]
그런데 아래처럼 멈췄습니다. 몇 번 줄의 무엇을 고쳐야 할까요? 고친 줄을 쓰세요.
times = [52, 48, 50]
fast = times.sort()
print(fast[0])
print(times)
Traceback (most recent call last): File "main.py", line 3, in <module> print(fast[0]) ~~~~^^^TypeError: 'NoneType' object is not subscriptable힌트
3번 줄에서 fast가 무엇을 가리키는지, 그 값에 이름을 붙인 줄로 거슬러 올라가 봅니다. 나와야 할 둘째 줄도 함께 보세요.
정답
2번 줄을 fast = sorted(times)로 고칩니다.
times = [52, 48, 50]
fast = sorted(times)
print(fast[0])
print(times)48
[52, 48, 50]맨 아래 줄은 NoneType(None의 종류)에서는 대괄호로 칸을 꺼낼 수 없다는 뜻입니다. 오류는 3번 줄에서 났지만 까닭은 2번 줄입니다. .sort()는 times를 제자리에서 정렬하고 None을 돌려줘, fast가 None에 붙었습니다. sorted(times)는 정렬한 새 리스트를 돌려주고 times는 처음 차례 그대로 둡니다.
- 다르게 고쳐도 되는 곳: 2번 줄을
fast = times.copy()로 고치고 그 아래에fast.sort()를 더해도 같은 두 줄이 찍힙니다. 사본을 제자리에서 정렬하니 times는 그대로입니다. 2번 줄에fast = [48]을 바로 써도 같은 두 줄이 찍히지만, 기록을 바꾸면 따라 바뀌지 않습니다. - 흔한 오답은 3번 줄만
print(fast)로 고치는 것입니다. 오류는 사라지지만None이 찍히고, times는 이미 정렬되어 둘째 줄도 처음 차례가 아닙니다.
times = [52, 48, 50]
fast = times.sort()
print(fast)
print(times)None
[48, 50, 52]2번 줄을 times.sort()로, 3번 줄을 print(times[0])으로 고쳐도 48은 찍히지만 둘째 줄이 [48, 50, 52]입니다. 정렬하면서 처음 차례를 잃었습니다.
다시 볼 레슨: 정렬: sort와 sorted · 리스트를 제자리에서 바꾸기
문제 11 (만들어 보기)
주문 목록에서 4,000원 넘는 메뉴만 골라 합계를 내는 계산기를 만들어 봅니다. 가격 가운데 4,000원 넘는 값만 새 리스트에 골라 담고, 고른 값의 합계를 찍습니다. 이렇게 나와야 합니다.
[4500, 5500]
합계 10000
1번 줄의 prices를 [3000, 4000]으로 바꾸면 이렇게 나와야 합니다.
[]
합계 0
아래 뼈대에서 1번 줄은 그대로 두고, 주석 다섯 아래를 채우세요. 다 쓰면 둘째 값으로도 따라가 봅니다.
prices = [4500, 3000, 5500]
# 1. 빈 리스트
# 2. 하나씩 꺼내 (맞으면) 담기
# 3. 합을 0으로
# 4. 하나씩 꺼내 더하기
# 5. 끝나고 쓰기
처음 펼 때 약 6MB를 받습니다.
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
견줄 시험 값
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.
힌트
2번은 거르기, 4번은 합 모으기에서 쓴 줄입니다. 4,000원짜리가 고를 값에 드는지 보세요.
정답
모범 답입니다.
prices = [4500, 3000, 5500]
# 1. 빈 리스트
picked = []
# 2. 하나씩 꺼내 (맞으면) 담기
for price in prices:
if price > 4000:
picked.append(price)
# 3. 합을 0으로
total = 0
# 4. 하나씩 꺼내 더하기
for price in picked:
total = total + price
# 5. 끝나고 쓰기
print(picked)
print('합계', total)[4500, 5500]
합계 10000[3000, 4000]이면 두 값 모두 price > 4000이 거짓이라 picked는 빈 리스트 그대로이고, 4번의 반복은 한 바퀴도 돌지 않아 total이 0입니다.
- 다르게 써도 되는 곳: 2번 반복에서 담을 때 함께 더해도 됩니다(
total = 0을 반복 앞에 두고 담는 줄 아래에total = total + price). 2번을 컴프리헨션으로 써도 되고, 12번 줄을total += price로 써도 됩니다. - 찍은 화면이 위와 같고 둘째 값에서도
[]와합계 0이 나오면 맞습니다. - 흔한 오답은 조건을
price >= 4000으로 쓰는 것입니다. 첫 값에는 4000이 없어 같지만, 둘째 값에서[4000]과합계 4000이 찍힙니다. 합을 고른 값의 첫 값에서 시작하면(total = picked[0]) 둘째 값에서 고른 값이 없어IndexError로 멈춥니다. 4번에서 prices를 돌면 고르지 않은 값까지 더해합계 13000이 찍히고,picked = []를 반복 안에 두면 바퀴마다 비워[5500]만 남습니다.
다시 볼 레슨: 거르기와 바꿔 담기 · 합 모으기와 세기
문제 12 (만들어 보기)
이번에는 빈 데서 씁니다. 카페 냉장고의 온도를 네 번 적은 리스트에서 가장 높은 온도를 찾아 찍는 프로그램을 쓰세요. max()는 쓰지 않습니다. 이렇게 나와야 합니다.
가장 높은 온도 5
temps를 냉동고 기록 [-18, -15, -20]으로 바꾸면 이렇게 나와야 합니다.
가장 높은 온도 -15
아래 칸의 1번 줄에 냉장고 기록이 있습니다. 그 아래를 씁니다.
temps = [3, 5, 2, 4]
처음 펼 때 약 6MB를 받습니다.
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
견줄 시험 값
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.
힌트
하위 목표 셋의 주석을 먼저 씁니다 — 1번은 견주기 전에 best를 붙여 둘 값, 2번은 '하나씩 꺼내 견주어 바꾸기', 3번은 '끝나고 쓰기'입니다. best를 처음 어느 값에 붙일지는 냉동고 기록으로도 따라가 보세요.
정답
모범 답입니다.
temps = [3, 5, 2, 4]
# 1. 첫 값을 최고로
best = temps[0]
# 2. 하나씩 꺼내 견주어 바꾸기
for temp in temps:
if temp > best:
best = temp
# 3. 끝나고 쓰기
print('가장 높은 온도', best)가장 높은 온도 5냉동고 기록이면 best가 첫 값 -18에서 시작해 -15에서 한 번 바뀌고, -20은 더 작아 바뀌지 않아 -15가 찍힙니다.
- 다르게 써도 되는 곳: 조건을
temp >= best로 써도 두 기록 모두 같습니다.temps[1:]로 둘째 값부터 돌아도 되고, 꺼낸 값의 이름은 다른 낱말로 지어도 됩니다. - 찍은 화면이 위와 같고 냉동고 기록에서도
가장 높은 온도 -15가 나오면 맞습니다. - 흔한 오답은 best를 0에서 시작하는 것입니다. 냉장고 기록에서는 5로 같지만, 냉동고 기록에서는 어느 값도 0보다 크지 않아 리스트에 없는 0이 찍힙니다. best를 반복 안에서 첫 값에 다시 붙이면 앞에서 찾은 최고를 잊어 냉장고 기록에서 4가 찍히고,
if없이 바퀴마다 붙여도 마지막 값 4가 찍힙니다.
다시 볼 레슨: 가장 큰 값 찾기