* 언패킹 실전문제 20개

주제: print에서의 언패킹, 함수 호출 시 언패킹, 리스트 결합, starred assignment, zip과의 결합, 실수하기 쉬운 포인트

구성: 문제 코드 → 실행 결과 → 상세 설명 → 핵심 포인트

핵심 개념 1
*iterable은 값을 풀어서 전달합니다.
핵심 개념 2
a, *b, c = ...처럼 나머지를 모을 수 있습니다.
핵심 개념 3
[*a, *b]로 리스트를 자연스럽게 합칠 수 있습니다.
핵심 개념 4
zip(*data)는 행과 열을 바꾸는 대표 패턴입니다.

1. 기초 문제

문제 1 · 리스트 언패킹 출력

다음 코드의 출력 결과를 쓰시오.

a = [1, 2, 3]
print(*a)
결과:
1 2 3
설명: *a는 리스트 [1, 2, 3]을 각각의 값으로 풀어 print(1, 2, 3)처럼 전달합니다. print(a)와 달리 대괄호 없이 공백으로 나열됩니다.
문제 2 · 문자열 언패킹

다음 코드의 출력 결과를 쓰시오.

word = "star"
print(*word)
결과:
s t a r
설명: 문자열도 iterable이므로 문자 하나씩 꺼낼 수 있습니다. 따라서 *word's', 't', 'a', 'r'로 풀립니다.
문제 3 · 튜플 언패킹

다음 코드의 출력 결과를 쓰시오.

t = (10, 20, 30)
print(*t)
결과:
10 20 30
설명: 튜플도 리스트와 동일하게 언패킹할 수 있습니다. 즉 print(10, 20, 30)과 같은 효과가 납니다.
문제 4 · print와 sep

다음 코드의 출력 결과를 쓰시오.

a = [1, 2, 3]
print(*a, sep=' / ')
결과:
1 / 2 / 3
설명: 언패킹으로 전달된 여러 값 사이의 구분자는 sep가 결정합니다. 여기서는 공백 대신 ' / '가 들어갑니다.
문제 5 · 제너레이터 언패킹

다음 코드의 출력 결과를 쓰시오.

print(*(x*x for x in range(4)))
결과:
0 1 4 9
설명: 괄호 안은 제너레이터 표현식입니다. *가 이 값을 하나씩 꺼내 print에 전달합니다. 따라서 제너레이터 객체 자체가 아니라 실제 값들이 출력됩니다.

2. 함수 호출 시 언패킹

문제 6 · 함수 인자 분해

다음 코드의 결과를 쓰시오.

def add(a, b, c):
    return a + b + c

nums = [3, 4, 5]
print(add(*nums))
결과:
12
설명: *nums3, 4, 5로 풀립니다. 따라서 함수 호출은 add(3, 4, 5)와 같아집니다.
문제 7 · 인자 개수 맞추기

다음 코드의 결과를 쓰시오.

def f(x, y):
    print(x, y)

pair = (100, 200)
f(*pair)
결과:
100 200
설명: 튜플의 두 값이 각각 x, y로 들어갑니다. 언패킹은 인자 수가 함수 정의와 맞아야 정상 동작합니다.
문제 8 · range와 언패킹

다음 코드의 결과를 쓰시오.

print(*range(1, 6))
결과:
1 2 3 4 5
설명: range(1, 6)은 1부터 5까지의 값을 만듭니다. *가 이를 하나씩 꺼내서 출력합니다.
문제 9 · max와 언패킹

다음 코드의 결과를 쓰시오.

nums = [7, 1, 9, 4]
print(max(*nums[:2], 8))
결과:
8
설명: nums[:2][7, 1]입니다. 따라서 max(*nums[:2], 8)max(7, 1, 8)이 되어 결과는 8입니다.
문제 10 · 에러 판단

다음 코드는 정상 실행될까요?

def add(a, b, c):
    return a + b + c

nums = [1, 2]
print(add(*nums))
결과:
TypeError 발생
설명: 함수는 인자 3개가 필요하지만 nums에는 값이 2개뿐입니다. 언패킹은 편리하지만, 함수가 요구하는 개수와 정확히 맞아야 합니다.

3. 리스트 결합과 생성

문제 11 · 리스트 합치기

다음 코드의 결과를 쓰시오.

a = [1, 2]
b = [3, 4]
c = [*a, *b]
print(c)
결과:
[1, 2, 3, 4]
설명: 리스트 안에서의 *는 다른 iterable의 원소를 풀어서 넣습니다. 따라서 [*a, *b]는 두 리스트를 자연스럽게 이어 붙인 새 리스트가 됩니다.
문제 12 · 중간 삽입

다음 코드의 결과를 쓰시오.

a = [2, 3]
b = [7, 8]
c = [0, *a, 5, *b, 9]
print(c)
결과:
[0, 2, 3, 5, 7, 8, 9]
설명: 언패킹은 리스트의 앞, 중간, 뒤 어디든 사용할 수 있습니다. 즉 값을 원하는 위치에 끼워 넣으면서 새로운 리스트를 만들 수 있습니다.
문제 13 · 문자열을 리스트로 풀기

다음 코드의 결과를 쓰시오.

letters = [*"ABC"]
print(letters)
결과:
['A', 'B', 'C']
설명: 문자열은 문자들의 순서열이므로 리스트 안에서 언패킹하면 한 글자씩 분리되어 들어갑니다.
문제 14 · 빈 리스트와 결합

다음 코드의 결과를 쓰시오.

a = []
b = [1, 2]
print([*a, *b])
결과:
[1, 2]
설명: 빈 리스트를 언패킹해도 추가되는 값이 없으므로 결과에는 b의 원소만 들어갑니다.

4. starred assignment

문제 15 · 나머지 모으기

다음 코드의 결과를 쓰시오.

a, *b = [10, 20, 30, 40]
print(a)
print(b)
결과:
10
[20, 30, 40]
설명: 맨 앞의 값은 a에 들어가고, 나머지는 모두 리스트 형태로 b에 모입니다. 이때 b는 항상 리스트입니다.
문제 16 · 가운데 모으기

다음 코드의 결과를 쓰시오.

a, *b, c = [1, 2, 3, 4, 5]
print(a)
print(b)
print(c)
결과:
1
[2, 3, 4]
5
설명: 첫 값은 a, 마지막 값은 c, 가운데 값들은 전부 b에 리스트로 담깁니다. 시험에서 매우 자주 나오는 형태입니다.
문제 17 · 값이 하나뿐일 때

다음 코드의 결과를 쓰시오.

a, *b = [7]
print(a)
print(b)
결과:
7
[]
설명: 첫 값 7은 a에 들어갑니다. 남는 값이 없으므로 b는 빈 리스트가 됩니다.
문제 18 · 에러 판단

다음 코드는 정상 실행될까요?

a, *b, c = [1]
결과:
ValueError 발생
설명: ac에 최소 한 개씩은 값이 있어야 하는데, 리스트에는 값이 하나뿐입니다. 따라서 언패킹할 값이 부족하여 오류가 납니다.

5. zip과 함께 쓰는 실전 패턴

문제 19 · zip(*) 구조 바꾸기

다음 코드의 결과를 쓰시오.

pairs = [('a', 1), ('b', 2), ('c', 3)]
x, y = zip(*pairs)
print(x)
print(y)
결과:
('a', 'b', 'c')
(1, 2, 3)
설명: *pairs('a', 1), ('b', 2), ('c', 3)를 각각의 인자로 전달합니다. 그러면 zip이 같은 위치끼리 묶어 첫 번째 요소들, 두 번째 요소들로 재구성합니다. 즉 행과 열을 바꾸는 효과가 납니다.
문제 20 · 실전 응용

다음 코드의 결과를 쓰시오.

star = ['① A', '② B', '③ C', '④ D', '⑤ E']
print(*(x for x in star if x[0] not in '①②④⑤'))
결과:
③ C
설명:
  • x[0]는 각 문자열의 첫 글자입니다.
  • '①②④⑤'에 없는 첫 글자를 가진 항목만 남깁니다.
  • 따라서 '③ C'만 조건을 통과합니다.
  • 제너레이터 표현식만 그대로 출력하면 객체 정보만 보일 수 있지만, 앞에 *를 붙이면 실제 값이 풀려서 출력됩니다.

최종 핵심 정리

1. print(*a)print(a)와 다릅니다. 전자는 값을 풀어서 출력하고, 후자는 리스트/튜플 자체를 출력합니다.
2. 함수 호출에서 *를 쓰면 iterable의 원소가 각각의 위치 인자로 들어갑니다.
3. [*a, *b]는 리스트 결합의 대표 패턴입니다.
4. a, *b, c = ...에서 별표가 붙은 변수는 남는 값을 리스트로 받습니다.
5. zip(*data)는 행과 열을 바꾸는 매우 중요한 패턴입니다.

시험에 자주 나오는 실수

한 줄 요약

*는 iterable의 값을 풀어서 전달하는 기호이며, 출력·함수 호출·리스트 결합·구조 분해에서 매우 자주 사용됩니다.