점프 투 파이썬 DAY7-4(2장 문제)

정지범·2026년 9월 16일

점프 투 파이썬

목록 보기
9/37

! 02장에서는 숫자형, 문자열, 리스트, 튜플, 딕셔너리, 집합, 불 자료형 그리고 변수에 대해서 공부했다.

  • 이번에는 지금까지 공부한 내용을 연습문제를 통해 다시 확인해 보자.
  • 단순히 정답만 확인하기보다는 왜 이런 결과가 나오는지 이해하는 것이 중요하다.
  • 특히 문자열의 인덱싱과 슬라이싱, 리스트 함수, 튜플의 특징, 딕셔너리의 Key, 집합의 중복 제거, 변수와 객체의 관계를 다시 한번 확인해 보자.

Q1. 평균 점수 구하기

국어 80점, 영어 75점, 수학 55점을 받은 학생의 평균 점수를 구해 보자.

korean = 80
english = 75
math = 55

average = (korean + english + math) / 3
print(average)

실행 결과

70.0

풀이

평균은 모든 점수를 더한 뒤 과목의 개수로 나누면 된다.

80 + 75 + 55
= 210

그리고 과목은 총 3개이므로

210 / 3
= 70.0

이 된다.


파이썬에서 / 연산자를 사용하면 나눗셈 결과가 실수형으로 반환된다.

>>> 210 / 3
70.0

핵심

평균 = 값들의 합 / 값의 개수



Q2. 홀수와 짝수 판별하기

자연수 13이 홀수인지 짝수인지 확인해 보자.

>>> 13 % 2
1
  • %는 나머지를 구하는 연산자이다.
13 ÷ 2

몫     = 6
나머지 = 1

풀이

숫자를 2로 나누었을 때 나머지를 확인하면 홀수와 짝수를 구분할 수 있다.

2로 나눈 나머지가 0 → 짝수

2로 나눈 나머지가 1 → 홀수

따라서

13 % 2

의 결과가 1이므로 13은 홀수이다.


다른 숫자도 확인해 보자.

>>> 10 % 2
0
10 → 짝수
>>> 7 % 2
1
7 → 홀수

핵심

숫자 % 2 == 0    # 짝수
숫자 % 2 == 1    # 홀수



Q3. 문자열 나누기

다음과 같은 문자열이 있다고 하자.

pin = "881120-1068234"
  • 앞의 생년월일 부분과
  • 뒤의 숫자 부분을

각각 나누어서 출력해 보자.

pin = "881120-1068234"

yyyymmdd = pin[:6]
num = pin[7:]

print(yyyymmdd)
print(num)

실행 결과

881120
1068234

풀이

문자열은 슬라이싱을 이용해서 원하는 부분만 가져올 수 있다.

문자열의 인덱스를 확인해 보면 다음과 같다.

8 8 1 1 2 0 - 1 0 6 8 2 3 4
0 1 2 3 4 5 6 7 8 9 ...

생년월일 부분

pin[:6]

은 처음부터 인덱스 6 직전까지 가져온다.

0 ~ 5

↓

881120

뒤쪽 숫자 부분

pin[7:]

은 인덱스 7부터 문자열의 끝까지 가져온다.

1068234

인덱스 6에는 -가 있기 때문에 제외하고 7부터 시작한다.

핵심

문자열[시작:끝]
시작 → 포함
끝   → 포함하지 않음



Q4. 특정 위치의 문자 가져오기

앞의 문자열에서 뒷부분의 첫 번째 숫자를 출력해 보자.

pin = "881120-1068234"

print(pin[7])

실행 결과

1

풀이

문자열에서 특정 문자 하나를 가져올 때는 인덱싱을 사용한다.

8 8 1 1 2 0 - 1 0 6 8 2 3 4
0 1 2 3 4 5 6 7 8 9 ...
              ↑
            pin[7]

따라서

pin[7]

은 문자 '1'을 반환한다.


여기서 중요한 것은 결과가 숫자형 1이 아니라 문자열 '1'이라는 점이다.

>>> type(pin[7])
<class 'str'>

핵심

문자열의 특정 위치 하나 → 인덱싱

문자열의 일정 범위 → 슬라이싱



Q5. 문자열 바꾸기

다음 문자열의 : 문자를 모두 #으로 바꾸어 보자.

a = "a:b:c:d"

replace() 함수를 사용할 수 있다.

a = "a:b:c:d"

b = a.replace(":", "#")

print(b)

실행 결과

a#b#c#d

풀이

replace()는 문자열의 특정 값을 다른 값으로 바꾸어 새로운 문자열을 반환한다.

기본 형태는 다음과 같다.

문자열.replace("기존 문자열", "바꿀 문자열")

따라서

a.replace(":", "#")

은

:

를 모두

#

으로 바꾼다.


문자열은 직접 수정할 수 없는 자료형이므로 원래 변수 a 자체가 수정되는 것은 아니다.

>>> a
'a:b:c:d'

새로운 결과를 b에 저장한 것이다.

핵심

문자열.replace("기존 값", "새로운 값")



Q6. 리스트 정렬하기

다음 리스트를 큰 숫자부터 작은 숫자 순서로 만들어 보자.

a = [1, 3, 5, 4, 2]

먼저 sort()를 사용한다.

a = [1, 3, 5, 4, 2]

a.sort()
print(a)

실행 결과

[1, 2, 3, 4, 5]

이 상태에서 reverse()를 사용한다.

a.reverse()

print(a)

실행 결과

[5, 4, 3, 2, 1]

풀이

sort()는 리스트를 기본적으로 오름차순으로 정렬한다.

[1, 3, 5, 4, 2]

↓

sort()

↓

[1, 2, 3, 4, 5]

reverse()는 현재 리스트의 순서를 반대로 뒤집는다.

[1, 2, 3, 4, 5]

↓

reverse()

↓

[5, 4, 3, 2, 1]

한 번에 다음과 같이 작성할 수도 있다.

a = [1, 3, 5, 4, 2]

a.sort(reverse=True)

print(a)

실행 결과

[5, 4, 3, 2, 1]

핵심

sort()            → 오름차순 정렬

reverse()         → 현재 순서를 반대로

sort(reverse=True) → 내림차순 정렬



Q7. 리스트를 하나의 문자열로 만들기

다음 리스트를 하나의 문장으로 만들어 보자.

a = ['Life', 'is', 'too', 'short']

결과는 다음과 같이 만들고 싶다.

Life is too short

join()을 사용하면 된다.

a = ['Life', 'is', 'too', 'short']

result = " ".join(a)

print(result)

실행 결과

Life is too short

풀이

join()은 문자열 사이에 특정 문자를 넣어 하나의 문자열로 연결한다.

" ".join(a)

여기에서

" "

는 공백 한 칸이다.

따라서 다음처럼 연결된다.

Life + " " + is + " " + too + " " + short

결과는

Life is too short

가 된다.


만약 #으로 연결한다면 다음과 같다.

>>> "#".join(a)
'Life#is#too#short'

핵심

"연결할 문자".join(리스트)



Q8. 튜플에 값 추가하기

다음 튜플에 숫자 4를 추가해 보자.

a = (1, 2, 3)

결과는 다음과 같이 만들고 싶다.

(1, 2, 3, 4)

a = (1, 2, 3)

b = a + (4,)

print(b)

실행 결과

(1, 2, 3, 4)

풀이

튜플은 값을 직접 수정하거나 추가할 수 없는 불변(immutable) 자료형이다.

따라서 다음처럼 사용할 수 없다.

a.append(4)

튜플에는 append()가 없다.


대신 기존 튜플과 새로운 튜플을 +로 합쳐 새로운 튜플을 생성한다.

a + (4,)
(1, 2, 3) + (4,)

↓

(1, 2, 3, 4)

(4,)에서 쉼표가 필요한 이유

요소가 하나뿐인 튜플을 만들 때는 반드시 쉼표 ,가 필요하다.

(4,)   # 튜플

반면

(4)    # 정수

이다.

>>> type((4,))
<class 'tuple'>

>>> type((4))
<class 'int'>

핵심

튜플은 수정 X

기존 튜플 + 새로운 튜플
→ 새로운 튜플 생성



Q9. 딕셔너리의 Key

다음과 같은 딕셔너리 a가 있다.

a = dict()
a >>> {} 
a = {}

다음 중 오류가 발생하는 코드를 찾아보자.

a['name'] = 'python'

a[('a',)] = 'python'

a[[1]] = 'python'

a[250] = 'python'

정답

a[[1]] = 'python'

이 코드에서 오류가 발생한다.

TypeError: unhashable type: 'list'

풀이

딕셔너리의 Key에는 변경할 수 없는 자료형을 사용할 수 있다.

문자열

a['name'] = 'python'
사용 가능 O

튜플

a[('a',)] = 'python'
사용 가능 O

리스트

a[[1]] = 'python'
사용 불가능 X
  • 리스트는 내부의 값을 변경할 수 있는 자료형이기 때문이다.

숫자

a[250] = 'python'
사용 가능 O

간단하게 정리하면 다음과 같다.

자료형딕셔너리 Key
문자열O
숫자O
튜플O
리스트X

핵심

변경 가능한 리스트 → Key 사용 X

변경 불가능한 문자열, 숫자, 튜플 → Key 사용 가능



Q10. 딕셔너리에서 값 추출하기

다음 딕셔너리에서 Key가 'B'인 값을 꺼내 보자.

a = {
    'A': 90,
    'B': 80,
    'C': 70
}

pop()을 사용할 수 있다.

a = {'A': 90, 'B': 80, 'C': 70}

result = a.pop('B')

print(a)
print(result)

실행 결과

{'A': 90, 'C': 70}
80

풀이

pop()은 해당 Key의 Value를 반환하면서 동시에 딕셔너리에서 삭제한다.

a.pop('B')

를 실행하면

'B' : 80

중에서 80을 반환하고 'B' 항목은 딕셔너리에서 사라진다.


실행 전

{
    'A': 90,
    'B': 80,
    'C': 70
}
a.pop('B')
반환값

80
실행 후

{
    'A': 90,
    'C': 70
}

get()과 비교하기

get()은 값을 가져오기만 하고 삭제하지 않는다.

a.get('B')

반면

a.pop('B')

은 값을 가져오면서 삭제한다.

함수값 반환삭제
get()OX
pop()OO

핵심

get() → 가져오기

pop() → 가져오기 + 삭제



Q11. 리스트의 중복 제거하기

다음 리스트에서 중복된 숫자를 제거해 보자.

a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]

집합 자료형을 이용할 수 있다.

a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]

a_set = set(a)

result = list(a_set)

print(result)

실행 결과 예시

[1, 2, 3, 4, 5]

풀이

집합 자료형의 가장 중요한 특징 중 하나는 중복을 허용하지 않는다는 것이다.

따라서

set(a)

를 실행하면

[1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]

↓

set()

↓

{1, 2, 3, 4, 5}

가 된다.


다시 리스트가 필요하다면 list()를 사용한다.

list(set(a))

따라서 간단하게 다음과 같이 작성할 수도 있다.

result = list(set(a))

단, 집합은 순서를 보장하지 않는 자료형이기 때문에 원래 리스트의 순서를 반드시 유지해야 하는 경우에는 주의해야 한다.

핵심

list(set(리스트))
리스트 → set → 중복 제거 → 다시 리스트



Q12. 같은 리스트를 가리키는 변수

다음 코드를 살펴보자.

a = b = [1, 2, 3]

그리고 a의 두 번째 요소를 변경한다.

a[1] = 4

그 후 b를 출력하면 어떻게 될까?

print(b)

실행 결과

[1, 4, 3]

풀이

처음 코드를 보면 a와 b에 각각 [1, 2, 3]이라는 리스트가 만들어졌다고 생각하기 쉽다.

하지만 실제로는 그렇지 않다.

a = b = [1, 2, 3]

를 실행하면 하나의 리스트 객체를 a와 b가 함께 가리키게 된다.

        ┌───────────┐
a ─────▶│ [1, 2, 3] │
        └───────────┘
             ▲
             │
b ───────────┘

따라서

a[1] = 4

를 실행하면 a만 변경되는 것이 아니라 두 변수가 보고 있는 하나의 리스트 객체 자체가 변경된다.

        ┌───────────┐
a ─────▶│ [1, 4, 3] │
        └───────────┘
             ▲
             │
b ───────────┘

그래서

print(b)

의 결과도

[1, 4, 3]

이 된다.


Q12-1. 같은 객체인지 확인하기

is를 사용하면 두 변수가 같은 객체를 가리키는지 확인할 수 있다.

>>> a = b = [1, 2, 3]

>>> a is b
True
  • 결과가 True이므로 같은 리스트 객체를 가리키고 있다.

Q12-2. 서로 다른 리스트로 만들고 싶다면?

리스트를 별도로 복사하면 된다.

a = [1, 2, 3]

b = a.copy()

이 상태에서

a[1] = 4

를 실행해 보자.

print(a)
print(b)

실행 결과

[1, 4, 3]
[1, 2, 3]
  • 이번에는 a만 변경되고 b는 변경되지 않는다.

두 변수는 서로 다른 객체를 가리키기 때문이다.

a ─────▶ [1, 4, 3]


b ─────▶ [1, 2, 3]

핵심

a = b = [1, 2, 3]
같은 리스트 객체를 가리킴

반면

a = [1, 2, 3]
b = a.copy()
서로 다른 리스트 객체



2장 되새김 문제 핵심 정리

지금까지 2장에서 배운 내용을 문제를 통해 다시 확인했다.

문제핵심 내용
Q1숫자 연산, 평균 계산
Q2나머지 연산자 %
Q3문자열 슬라이싱
Q4문자열 인덱싱
Q5replace()
Q6sort(), reverse()
Q7join()
Q8튜플 연산
Q9딕셔너리 Key
Q10딕셔너리 pop()
Q11집합을 이용한 중복 제거
Q12변수와 객체의 관계

! 2장에서 꼭 기억해야 할 내용

숫자

13 % 2
  • % → 나머지
  • 짝수 판별 → number % 2 == 0

문자열

a[0]

→ 인덱싱

a[0:3]

→ 슬라이싱

a.replace(":", "#")

→ 문자열 변경 결과 생성


리스트

a.sort()

→ 정렬

a.reverse()

→ 순서 뒤집기


문자열과 리스트

" ".join(a)

→ 리스트의 문자열을 하나로 연결


튜플

(1, 2, 3) + (4,)

→ 기존 튜플을 수정하는 것이 아니라 새로운 튜플 생성


딕셔너리

a.pop('B')

→ 값을 반환하면서 해당 요소 삭제

딕셔너리의 Key에는 리스트처럼 변경 가능한 자료형을 사용할 수 없다.


집합

list(set(a))

→ 중복 제거


변수

a = b = [1, 2, 3]

→ a와 b가 같은 리스트 객체를 가리킨다.

따라서

a[1] = 4

를 실행하면 b에서도 변경된 값을 확인할 수 있다.


2장에서 가장 중요한 것은 단순히 문법을 외우는 것이 아니라 각 자료형의 특징을 구분하는 것이다.

숫자       → 계산
문자열     → 문자 데이터
리스트     → 순서 O / 수정 O
튜플       → 순서 O / 수정 X
딕셔너리   → Key : Value
집합       → 순서 X / 중복 X
불         → True / False
변수       → 객체를 가리키는 이름

이 개념들을 확실하게 이해해 두면 다음 장에서 배우는 if, while, for 제어문도 훨씬 쉽게 이해할 수 있다.

profile
성실하자:)

0개의 댓글