점프 투 파이썬 DAY9(3장 문제)

정지범·2026년 9월 18일

점프 투 파이썬

목록 보기
13/37

! 03장에서는 프로그램의 흐름을 제어하기 위한 if, while, for문에 대해서 공부했다.

  • 이번에는 지금까지 배운 제어문을 문제를 통해 다시 확인해 보자.
  • 단순히 정답만 확인하기보다는 조건이 어떤 순서로 검사되는지, 반복문이 언제 종료되는지, 변수의 값이 어떻게 변하는지 직접 따라가는 것이 중요하다.

Q1. 조건문의 참과 거짓

다음 코드를 실행했을 때 출력되는 값을 알아보자.

a = "Life is too short, you need python"

if "wife" in a:
    print("wife")
elif "python" in a and "you" not in a:
    print("python")
elif "shirt" not in a:
    print("shirt")
elif "need" in a:
    print("need")
else:
    print("none")

실행 결과

shirt

풀이

if - elif - else문은 위에서부터 조건을 차례대로 검사한다.

그리고 조건이 처음으로 True가 되는 순간 해당 코드를 실행하고 나머지 조건은 확인하지 않는다.


첫 번째 조건

"wife" in a

문자열 a는 다음과 같다.

Life is too short, you need python

여기에 "wife"는 없다.

"wife" in a

↓

False

따라서 다음 조건으로 넘어간다.


두 번째 조건

"python" in a and "you" not in a

먼저

"python" in a

를 확인하면

True

이다.

하지만

"you" not in a

를 확인하면 문자열 안에 "you"가 존재하므로

False

이다.

결국

True and False

↓

False

가 된다.

따라서 다음 조건으로 넘어간다.


세 번째 조건

"shirt" not in a

문자열에는 "shirt"가 없다.

따라서

"shirt" not in a

↓

True

가 된다.

그래서

print("shirt")

가 실행된다.

실행 결과

shirt

여기서 중요한 점은 아래에 있는

elif "need" in a:

도 사실 조건만 확인하면 True라는 것이다.

하지만 이미 그 위의

elif "shirt" not in a:

가 True가 되었으므로 더 이상 아래 조건은 검사하지 않는다.


조건 검사 흐름

"wife" in a
→ False

        ↓

"python" in a and "you" not in a
→ True and False
→ False

        ↓

"shirt" not in a
→ True

        ↓

"shirt" 출력

        ↓

조건 검사 종료

핵심

if / elif 문은 위에서부터 검사한다.

처음 True가 나온 조건만 실행한다.

그 아래 조건은 더 이상 검사하지 않는다.



Q2. 3의 배수의 합 구하기

while문을 사용해서 1부터 1000까지의 자연수 중 3의 배수의 합을 구해 보자.

result = 0
i = 1

while i <= 1000:
    if i % 3 == 0:
        result += i

    i += 1

print(result)

실행 결과

166833

풀이

먼저 합계를 저장할 변수를 만든다.

result = 0

그리고 1부터 시작한다.

i = 1

while문의 조건은 다음과 같다.

while i <= 1000:

즉,

i가 1000 이하인 동안 반복

한다.


3의 배수 확인하기

if i % 3 == 0:

%는 나머지를 구하는 연산자이다.

3의 배수는 3으로 나누었을 때 나머지가 0이다.

3 % 3 = 0

6 % 3 = 0

9 % 3 = 0

12 % 3 = 0

따라서

i % 3 == 0

이면 현재 숫자는 3의 배수이다.


합계에 더하기

3의 배수를 발견하면

result += i

를 실행한다.

이는

result = result + i

와 같은 의미이다.


처음 몇 번의 반복을 살펴보면

i = 1
1 % 3 != 0
→ 더하지 않음

i = 2
2 % 3 != 0
→ 더하지 않음

i = 3
3 % 3 == 0
→ result = 0 + 3
→ 3

i = 4
→ 더하지 않음

i = 5
→ 더하지 않음

i = 6
→ result = 3 + 6
→ 9

와 같은 방식으로 계속 반복한다.


i 증가시키기

반복이 끝날 때마다

i += 1

을 실행한다.

1 → 2 → 3 → 4 → ... → 1000

만약 i += 1을 빼먹으면 i의 값이 변하지 않기 때문에 무한 루프가 발생할 수 있다.

핵심

while i <= 1000:

→ 1 ~ 1000까지 반복

i % 3 == 0

→ 3의 배수 확인

result += i

→ 합계 누적

i += 1

→ 다음 숫자로 이동




Q3. 별 표시하기

while문을 사용해서 다음과 같은 별을 출력해 보자.

*
**
***
****
*****

다음과 같이 작성할 수 있다.

i = 0

while True:
    i += 1

    if i > 5:
        break

    print("*" * i)

실행 결과

*
**
***
****
*****

풀이

먼저

i = 0

으로 시작한다.

그리고

while True:

를 사용했다.

True는 항상 참이므로 이 while문은 그대로 두면 계속 반복된다.

while True

↓

무한 루프

따라서 반복문 안에서 break를 사용해서 종료 조건을 만들어 주었다.

if i > 5:
    break

첫 번째 반복

i += 1

실행 후

i = 1

이 된다.

print("*" * i)

는

"*" * 1

이므로

*

을 출력한다.


두 번째 반복

i = 2
"*" * 2
**

세 번째 반복

i = 3
***

이런 식으로

i = 1 → *
i = 2 → **
i = 3 → ***
i = 4 → ****
i = 5 → *****

까지 출력한다.


그다음 반복에서

i = 6

이 되고

if i > 5:

가

6 > 5

↓

True

가 된다.

따라서

break

가 실행되면서 while문을 종료한다.


문자열 반복도 기억하자

"*" * 3

의 결과는

***

이다.

문자열에서 * 연산자는 문자열을 반복한다.

핵심

while True
→ 무한 반복

break
→ 반복문 종료

"*" * 숫자
→ 문자열 반복



Q4. 1부터 100까지 출력하기

for문과 range()를 사용해서 1부터 100까지의 숫자를 출력해 보자.

for i in range(1, 101):
    print(i)

실행 결과

1
2
3
4
5
...
98
99
100

풀이

range()의 기본 형태는 다음과 같다.

range(시작, 끝)

여기에서 끝 값은 포함하지 않는다.

따라서

range(1, 101)

은

1 이상
101 미만

↓

1 ~ 100

을 의미한다.


for문이 반복될 때마다 i에는 다음 숫자가 자동으로 들어간다.

첫 번째 반복
i = 1

두 번째 반복
i = 2

세 번째 반복
i = 3

...

마지막 반복
i = 100

따라서

print(i)

를 이용하면 1 ~ 100까지 출력할 수 있다.


Q4-1. i += 1은 필요한가?

참고한 코드에는 다음과 같은 형태가 들어 있다.

for i in range(1, 101):
    print(i)
    i += 1

하지만 여기서

i += 1

은 필요하지 않다.


for문은 range()가 만들어 놓은 값을 다음 반복에서 자동으로 변수에 넣는다.

예를 들어

for i in range(1, 4):

라면

첫 번째 반복
i = 1

두 번째 반복
i = 2

세 번째 반복
i = 3

이 자동으로 이루어진다.


따라서 반복문 안에서

i += 1

을 실행하더라도 다음 반복에서는 range()가 다시 다음 값을 i에 대입한다.

즉,

for i in range(1, 101):
    print(i)

만 작성하면 된다.

! while과 for의 차이

while에서는

i += 1

처럼 직접 값을 증가시켜야 하는 경우가 많다.

하지만 for + range에서는 다음 반복 값이 자동으로 들어오기 때문에 직접 증가시킬 필요가 없다.




Q5. 평균 점수 구하기

A 학급에 학생 10명이 있고 중간고사 점수가 다음과 같다고 하자.

scores = [70, 60, 55, 75, 95, 90, 80, 80, 85, 100]

for문을 사용해서 평균 점수를 구해 보자.

scores = [70, 60, 55, 75, 95, 90, 80, 80, 85, 100]

total = 0

for score in scores:
    total += score

average = total / len(scores)

print(average)

실행 결과

79.0

풀이

평균을 구하려면 먼저 모든 점수를 더해야 한다.

total = 0

에서 시작한다.


for문으로 점수를 하나씩 가져온다.

for score in scores:

첫 번째 반복에서는

score = 70

이므로

total += score

를 실행하면

total = 0 + 70

↓

70

이 된다.


두 번째 반복에서는

score = 60

이므로

total = 70 + 60

↓

130

이 된다.


이 작업을 모든 학생에게 반복하면

70
+ 60
+ 55
+ 75
+ 95
+ 90
+ 80
+ 80
+ 85
+ 100

= 790

이 된다.

따라서

total = 790

이다.


학생 수 구하기

학생 수는 리스트의 길이와 같다.

len(scores)

결과는

10

이다.


따라서 평균은

790 / 10

↓

79.0

이 된다.

핵심

total = 0

for score in scores:
    total += score

→ 모든 값의 합 구하기

len(scores)

→ 학생 수 구하기

total / len(scores)

→ 평균 구하기




Q6. 리스트 컴프리헨션 사용하기

다음 리스트가 있다고 하자.

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

이 중에서 홀수만 골라 2를 곱한 값을 새로운 리스트에 저장해 보자.


6-1. 일반 for문 사용하기

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

result = []

for n in numbers:
    if n % 2 == 1:
        result.append(n * 2)

print(result)

실행 결과

[2, 6, 10]

풀이

numbers에서 숫자를 하나씩 가져온다.

1
2
3
4
5

그리고 다음 조건을 확인한다.

n % 2 == 1

숫자를 2로 나누었을 때 나머지가 1이면 홀수이다.


n = 1

1 % 2 = 1

↓

홀수

따라서

result.append(1 * 2)

를 실행한다.

result = [2]

n = 2

2 % 2 = 0

↓

짝수

조건이 거짓이므로 아무 작업도 하지 않는다.


n = 3

3 % 2 = 1

↓

홀수

따라서

3 × 2 = 6

을 추가한다.

result = [2, 6]

n = 5

5 × 2 = 10

까지 추가하면 최종 결과는

[2, 6, 10]

이다.




6-2. 리스트 컴프리헨션으로 바꾸기

위 코드는 리스트 컴프리헨션을 이용하면 한 줄로 표현할 수 있다.

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

result = [n * 2 for n in numbers if n % 2 == 1]

print(result)

실행 결과

[2, 6, 10]

6-3. 리스트 컴프리헨션 읽는 방법

처음 보면 다음 코드가 조금 복잡해 보일 수 있다.

[n * 2 for n in numbers if n % 2 == 1]

다음 순서로 생각하면 쉽다.

numbers에서 n을 하나씩 가져온다.

↓

n이 홀수인지 확인한다.

↓

홀수라면 n * 2를 계산한다.

↓

계산 결과를 새로운 리스트에 넣는다.

일반 for문과 비교

일반 for문

result = []

for n in numbers:
    if n % 2 == 1:
        result.append(n * 2)

리스트 컴프리헨션

result = [
    n * 2
    for n in numbers
    if n % 2 == 1
]

줄만 나누어 보면 두 코드의 구조가 비슷하다는 것을 알 수 있다.


6-4. 리스트 컴프리헨션 기본 구조

조건이 없는 경우

[표현식 for 변수 in 반복자료]

예를 들어

[n * 2 for n in numbers]

조건이 있는 경우

[표현식 for 변수 in 반복자료 if 조건]

예를 들어

[n * 2 for n in numbers if n % 2 == 1]

핵심

for
→ 값을 하나씩 가져옴

if
→ 필요한 값만 선택

표현식
→ 선택된 값을 가공

[]
→ 결과를 새로운 리스트로 만듦



03장 되새김 문제 핵심 정리

이번 문제에서는 03장에서 공부한 if, while, for문을 다시 확인했다.

문제핵심 내용
Q1if / elif / else, in, and, not
Q2while, 나머지 연산, 누적 합
Q3while True, break, 문자열 반복
Q4for, range()
Q5for문을 이용한 누적 합과 평균
Q6리스트 컴프리헨션



if문 핵심

if 조건:
    실행문
elif 다른조건:
    실행문
else:
    실행문

조건은 위에서부터 차례대로 검사한다.

첫 번째 True 발견

↓

해당 코드 실행

↓

나머지 조건 검사 X

while문 핵심

while 조건:
    실행문

조건이 True인 동안 계속 반복한다.

조건 True
→ 반복

조건 False
→ 종료

무한 루프

while True:

→ 계속 반복

따라서 보통

break

와 함께 사용한다.


for문 핵심

for 변수 in 반복자료:
    실행문

반복 가능한 자료에서 값을 하나씩 가져온다.


range

range(1, 101)
1 ~ 100

끝 숫자는 포함하지 않는다.


break 핵심

break

→ 현재 반복문을 즉시 종료한다.


누적 합 핵심

total = 0

for value in values:
    total += value

→ 값을 계속 더해서 합계를 구한다.


리스트 컴프리헨션 핵심

[
    표현식
    for 변수 in 반복자료
    if 조건
]

예를 들어

[n * 2 for n in numbers if n % 2 == 1]

은

numbers에서 숫자를 가져옴

↓

홀수만 선택

↓

2를 곱함

↓

새로운 리스트 생성

을 의미한다.


! 03장 제어문에서 반드시 기억해야 할 핵심

제어문은 프로그램이 어떤 코드를 실행하고, 몇 번 반복할지 결정하는 문법이다.

먼저 if문은

조건을 판단한다.

True  → 실행
False → 실행하지 않음

을 담당한다.

if 조건:
   실행문

while문은

조건이 True인 동안 계속 반복

한다.

while 조건:
   실행문

특히 while문에서는

조건에 사용하는 값이 어떻게 변하는가?

를 반드시 확인해야 한다.

그렇지 않으면 무한 루프가 발생할 수 있다.


for문은

리스트나 range 등의 값을 하나씩 꺼내면서 반복

한다.

for 변수 in 반복자료:
   실행문

두 반복문을 간단하게 구분하면

while
→ 조건 중심
→ "언제까지 반복할까?"

for
→ 데이터 중심
→ "무엇을 하나씩 반복할까?"

라고 생각하면 쉽다.

그리고 반복문을 강제로 종료할 때는

break

를 사용한다.

마지막으로 파이썬에서는 for문으로 새로운 리스트를 만드는 작업을

[표현식 for 변수 in 반복자료 if 조건]

형태의 리스트 컴프리헨션으로 간단하게 표현할 수도 있다.

이번 03장에서 가장 중요하게 가져가야 할 것은

if    → 조건 판단
while → 조건이 참인 동안 반복
for   → 데이터를 하나씩 반복
break → 반복 종료

이 네 가지의 역할을 확실하게 구분하는 것이다.

profile
성실하자:)

0개의 댓글