본문으로 건너뛰기

단원 연습 문제

파이썬 목차리스트와 튜플문제 12개

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

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

바퀴iguests[i]출력
반복 앞(2번 줄)[30, 25]
113030
222525

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 > 30picked출력
112False[]
240True[40]
335True[40, 35]
48False[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 assignment

2번 줄은 오른쪽 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]

꺼낸 값마다 한 줄로 줄인 추적 표입니다.

nn < 60up에 담는 값ok에 담는 값 n >= 60
45True55False
80False담지 않음True
62False담지 않음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를 받습니다.

힌트

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를 받습니다.

힌트

하위 목표 셋의 주석을 먼저 씁니다 — 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가 찍힙니다.

다시 볼 레슨: 가장 큰 값 찾기

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

파이썬 목차로