Python/Chapter05. 루프와 반복문(예제다수)

lullaby ·2025년 10월 1일

Python

목록 보기
5/13

1. 핵심 개념: 루프와 반복문

1.1 while 반복문

기본 구조:

while 조건:
    # 반복할 코드
    # 조건이 참인 동안 계속 실행됨

주요 특징:

  • 조건이 참인 동안 계속 실행
  • 무한 루프 방지를 위해 반복 조건이 언젠가는 거짓이 되도록 설계해야 함
  • 변수 초기화가 루프 전에 필요함

1.2 for 반복문

기본 구조:

for 변수 in 범위/시퀀스:
    # 반복할 코드

주요 특징:

  • range() 함수와 많이 사용됨: range(시작, 끝, 스텝)
  • 리스트, 문자열 등 순회 가능한 객체에 대해 반복 수행
  • 횟수가 정해진 반복에 적합

1.3 반복문 제어 명령어

  • break: 반복문을 완전히 종료
  • 센티널 값: 특정 값이 입력되면 반복문을 종료하는 방식
    • continue: 현재 반복을 중단하고 다음 반복으로 이동

1.4 중첩 반복문

기본 구조:

for i in range():
    for j in range():
        # 코드 실행

주요 특징:

  • 반복문 안에 또 다른 반복문이 있는 구조
  • 행렬, 그리드 작업, 복잡한 패턴 생성에 유용
  • 실행 시간이 급격히 증가할 수 있으므로 효율성 고려 필요

2. 주요 예제 분석

2.1 구구단 출력 (while 문)

print("구구단 출력")
print("-"*30)
dan = int(input("몇 단을 출력할까요 ? "))
i = 1
while i <= 9:
    print("%d * %d = %d" %(dan, i, dan*i))
    i = i + 1

핵심 포인트:

  • 변수 초기화: i = 1
  • 반복 조건: i <= 9
  • 변수 증가: i = i + 1

2.2 배수의 합 계산

sum = 0
number = 1
while number <= 100:
    if number % 3 == 0:
        sum = sum + number
    number = number + 1
print("1부터 100사이의 모든 3의 배수의 합은 %d입니다." % sum)

핵심 포인트:

  • 누적 합계 변수: sum = 0
  • 조건부 누적: if number % 3 == 0
  • 범위 지정: while number <= 100

2.3 자리수의 합 계산

number = int(input("자리수의 합을 계산하기 위한 값을 입력하시오 : "))
sum = 0
while number > 0:
    digit = number % 10
    sum = sum + digit
    number = number // 10
print("자리수의 합은 %d입니다." % sum)

핵심 포인트!!!!!!!!!!!!!!!:

  • 1의 자리 추출: digit = number % 10
  • 자릿수 이동: number = number // 10
  • 종료 조건: number > 0 (모든 자릿수 처리 완료)

2.4 센티널을 이용한 성적 평균 계산

n = 0
sum = 0
score = 0
print("종료하려면 음수를 입력하시오")
while score >= 0:
    score = int(input("성적을 입력하시오: "))
    if score > 0:
        sum = sum + score
        n = n + 1
if n > 0:
    average = sum / n
    print("성적의 평균은 %f입니다." % average)

핵심 포인트:

  • 센티널 값: 음수 입력 시 종료
  • 유효한 데이터만 처리: if score > 0
  • 평균 계산 전 분모 검사: if n > 0

2.5 숫자 맞추기 게임

import random
tries = 0
number = random.randint(1, 100)
print("1부터 100사이의 숫자를 맞추시오")
while tries < 10:
    guess = int(input("숫자를 입력하시오: "))
    tries = tries + 1
    if guess < number:
        print("컴퓨터가 생각하는 숫자보다 더 작음!")
    elif guess > number:
        print("컴퓨터가 생각하는 숫자보다 더 큼!")
    else:
        break
if guess == number:
    print("축하합니다.정답입니다.시도횟수=", tries)
else:
    print("정답은 ", number)

핵심 포인트:

  • 무작위 수 생성: random.randint(1, 100)
  • 시도 횟수 제한: tries < 10
  • break 사용: 정답을 맞췄을 때 반복문 탈출

2.6 가위 바위 보 게임

from random import randint
def game(player):
    while True:
        player = input("scissors, rock, paper중에서 하나를 입력하고,게임을 끝내려면 q를 입력하세요: ")
        if player == "q":
            return
        elif player == "scissors":
            playerNum = 0
        elif player == "rock":
            playerNum = 1
        elif player == "paper":
            playerNum = 2
        else:
            continue
        list = ["scissors", "rock", "paper"]
        comNum = randint(0,2)
        print("● user :", player, "● computer :", list[comNum])
        if (playerNum-comNum==0):
            print("user and computer are in the same.")
        elif (playerNum-comNum==-2 or playerNum-comNum==1):
            print("user win !!")
        else:
            print("computer win !!")

player = input("게임을 시작하려면 s를 입력하세요: ")
if player =="s":
    print("게임이 시작되었습니다.")
    game(player)

핵심 포인트:

  • continue 사용: 잘못된 입력 시 재입력 요청
  • 함수 내부의 무한 루프: while True
  • 간단한 승패 결정 로직: playerNum-comNum 값 비교

2.7 중첩 반복문을 이용한 패턴 출력

for y in range(5):
    for x in range(10):
        print("* ", end="")
    print()

핵심 포인트:

  • 외부 루프: 행 반복 (y)
  • 내부 루프: 열 반복 (x)
  • end="" 파라미터로 줄바꿈 제어

2.8 피타고라스 직각삼각형 찾기

for a in range(1, 101, 1):
    for b in range(a, 101, 1):
        for c in range(b, 101, 1):
            if((a*a+b*b)==c*c):
                print(a, b, c)

핵심 포인트:

  • 3중 중첩 반복문 사용
  • 효율성 향상: ba부터, cb부터 시작
  • 조건 검사: 피타고라스 정리 a²+b²=c²

3. 예상 문제 및 풀이

문제 1: while 루프 기초

문제: 1부터 사용자가 입력한 수까지의 합을 계산하는 프로그램을 작성하시오.

풀이:

n = int(input("숫자를 입력하세요: "))
sum = 0
i = 1 #while은 초깃값 뺴먹지말기!!!!!!

while i <= n:
    sum += i
    i += 1

print(f"1부터 {n}까지의 합은 {sum}입니다.")

문제 2: for 루프와 range 함수

문제: range 함수를 사용하여 10부터 1까지 역순으로 출력하는 프로그램을 작성하시오.

풀이:

for i in range(10, 0, -1):
    print(i, end=" ")
print()  # 줄바꿈

문제 3: break와 continue 활용

문제: 1부터 100까지 숫자 중 7의 배수이거나 3의 배수인 경우만 출력하되, 합이 200을 초과하면 중단하는 프로그램을 작성하시오.

풀이:

sum = 0
for num in range(1, 101):
    if num % 7 == 0 or num % 3 == 0:
        print(num, end=" ")
        sum += num
        if sum > 200:
            print("\n합이 200을 초과했습니다. 현재 합:", sum)
            break
    else:
        continue

문제 4: 자리수 계산

문제:

풀이:

number = int(input("정수를 입력하세요: "))
original = number
count = 0

while number > 0:
    number = number // 10
    count += 1

print(f"{original}은(는) {count}자리 수입니다.")

문제 5: 중첩 반복문 패턴

문제: 다음과 같은 패턴을 출력하는 프로그램을 작성하시오.

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

풀이:

rows = 5
for i in range(1, rows + 1):
    for j in range(i):
        print("*", end="")
    print()

문제 6: 소수 찾기

문제: 2부터 100까지의 모든 소수를 찾아 출력하는 프로그램을 작성하시오.

풀이:

for num in range(2, 101):  # 2부터 100까지의 모든 숫자(num)를 확인
    is_prime = True  # 소수 여부를 저장하는 변수 (기본적으로 True로 설정)

    for i in range(2, int(num**0.5) + 1):  # 2부터 num의 제곱근까지 반복
        if num % i == 0:  # 나누어 떨어지는 수가 있으면
            is_prime = False  # 소수가 아님
            break  # 더 확인할 필요 없으므로 반복문 종료

    if is_prime:  # 소수라면 출력
        print(num, end=" ")  # 한 줄로 출력하기 위해 end=" " 추가3

문제 7: 센티널 값을 활용한 데이터 입력

문제: 사용자로부터 숫자를 입력받아 합계를 계산하되, 0이 입력되면 입력을 중단하고 지금까지의 합계와 평균을 출력하는 프로그램을 작성하시오.

풀이:

sum = 0
count = 0
print("숫자들을 입력하세요 (종료는 0):")

while True:
    num = float(input("숫자: "))
    if num == 0:
        break
    sum += num
    count += 1

if count > 0:
    print(f"합계: {sum}")
    print(f"평균: {sum / count}")
else:
    print("입력된 숫자가 없습니다.")
'''### 문### 문제 7: 센티널 값을 활용한 데이터 입력

**문제:** 사용자로부터 숫자를 입력받아 합계를 계산하되,
0이 입력되면 입력을 중단하고 지금까지의
합계와 평균을 출력하는 프로그램을 작성하시오.'''
sum=0
count=0
# 걍 냅다 print처넣기
'''알고리즘
1. while True처넣기
2. 숫자입력
3. 만약 입력된숫자가 0임: 멈춰씨발!
4. 아님:(계속진행됨): num추가, 카운트 +1
5. 이 다음은 break 당한 경우밖에 없으므로 만약 카운트>0: 합계평균출력
아님: 입력된숫자가없음을어필!)'''
print("숫자들을 입력하세요(종료는 0)")
while True:
    num = float(input("숫자?: "))
    if num == 0:
        break
    sum += num
    count += 1

if count>0:
    print(f"지금까지 입력된 숫자의 합계는: {sum}, 평균은 {sum/count}")
else:
    print("입력된 숫자가 없습니다.")

문제 8: 난수 생성과 반복문

문제: 주사위를 100번 던져서 각 숫자(1~6)가 나온 횟수를 세는 프로그램을 작성하시오.

풀이:

import random

counts = [0, 0, 0, 0, 0, 0]  # 인덱스 0은 사용하지 않음

for i in range(100):
    dice = random.randint(1, 6)
    counts[dice-1] += 1

for i in range(6):
    print(f"숫자 {i+1}: {counts[i]}번")
#내가한거
'''알고리즘
1. 랜덤임포트
2. 카운트리스트 준비
3. 100번굴려
4. 주사위수 = r.randint 지정해둠
5. 카운트[주사위수-1] += 1
개빡세네 시발
내가잘한점: 리스트[숫자] += 1 이거어케생각햇대 ㅎ'''
import random as r

counts = [0, 0, 0, 0, 0, 0]
for i in range(100):
    num = r.randint(1,6)
    counts[num-1] += 1
print(counts[0], counts[1], counts[2], counts[3], counts[4], counts[5])

문제 9: 중첩 루프와 조건문(개잘햇죠?ㅋㅋ)

문제: 구구단 중 짝수 단(2, 4, 6, 8단)만 출력하는 프로그램을 작성하시오.

풀이:

for dan in range(2, 10, 2):
    print(f"\n== {dan}단 ==")
    for i in range(1, 10):
        print(f"{dan} × {i} = {dan * i}")

문제 10: 실전 응용 문제

문제: 사용자로부터 양의 정수 n을 입력받아, 피보나치 수열의 첫 n개 항을 출력하는 프로그램을 작성하시오.

풀이:

n = int(input("출력할 피보나치 수열의 항 개수: "))

a, b = 0, 1 #초깃값지정해두기!! 피보나치수열=1,1,2,3...이딴식으로전개됨
count = 0

while count < n:
    print(a, end=" ") #앞두자리수의합>다음b가되므로 a만출력: ㅇㅋ
    a, b = b, a + b
    count += 1

4. 실전 대비 연습 문제

Python 반복문 실전 대비 연습 문제

기초 연습 문제

문제 1: 팩토리얼 계산

n!을 계산하는 프로그램을 작성하시오. (n은 사용자 입력)

문제 2: 구구단

사용자가 입력한 단 ~ 9단까지 구구단을 출력하는 프로그램을 작성하시오.

문제 3: 약수 찾기

사용자가 입력한 숫자의 모든 약수를 찾아 출력하는 프로그램을 작성하시오.

중급 연습 문제

문제 4: 완전수 찾기

1부터 1000까지의 수 중에서 완전수를 모두 찾아 출력하시오.
(완전수는 자기 자신을 제외한 약수의 합이 자기 자신과 같은 수)

#1부터 1000까지의 수 중에서 완전수를 모두 찾아 출력하시오.
#(완전수는 자기 자신을 제외한 약수의 합이 자기 자신과 같은 수) 

for i in range(1,1001):
    sum = 0
    for n in range(1, i):
        if i%n ==0:
            sum += n
        else:
            continue
    if sum == i:
        print(i, end=" ")

문제 5: 암스트롱 수 찾기

100부터 999까지의 암스트롱 수를 모두 찾아 출력하시오.
(각 자릿수의 세제곱의 합이 원래 수와 같은 수)

### 문제 5: 암스트롱 수 찾기

#100부터 999까지의 암스트롱 수를 모두 찾아 출력하시오.
#(각 자릿수의 세제곱의 합이 원래 수와 같은 수)
a=0
b=0
c=0
for i in range(100,1000):
    a=i//100 #백의자리수
    b=(i-a*100)//10 #십의자리수
    c=i%10
    if (a**3 + b**3 + c**3 == i):
        print(i)

문제 6: 별 패턴 출력

다음과 같은 패턴을 출력하시오.

    *
   ***
  *****
 *******
*********
for i in range(1,6):
    print(" "*(6-i), "*"*(2*i-1)) 우 하 하

고급 연습 문제

문제 7: 콜라츠 추측

사용자가 입력한 양의 정수 n에 대해 콜라츠 추측을 적용하여 1이 될 때까지의 과정과 단계 수를 출력하시오.

  • n이 짝수면 2로 나눔
  • n이 홀수면 3을 곱하고 1을 더함
  • 위 과정을 n이 1이 될 때까지 반복
### 문제 7: 콜라츠 추측

#사용자가 입력한 양의 정수 n에 대해
#콜라츠 추측을 적용하여 1이 될 때까지의 과정과 단계 수를 출력하시오.

#- n이 짝수면 2로 나눔
#- n이 홀수면 3을 곱하고 1을 더함
#- 위 과정을 n이 1이 될 때까지 반복

num = int(input("정수를 입력하시오: "))
while num != 1:
    if num%2 == 0:
        num //= 2
        print("num//2=", num)
    elif num%2 == 1:
        num = num*3 + 1
        print("num*3-1=",num)

문제 8: 최대공약수와 최소공배수

두 수를 입력받아 최대공약수와 최소공배수를 계산하는 프로그램을 작성하시오.

문제 9: 로또 번호 생성기

1부터 45까지의 숫자 중에서 중복되지 않는 6개의 숫자를 무작위로 선택하여 출력하는 로또 번호 생성기를 작성하시오.

0개의 댓글