Python 시리즈 8
[Python] #5 반복문

참고: codetree Trail 0의 Chapter 4, 8~9
1. 반복문
for i in range(반복횟수): # 변수가 따로 필요 없으면 i는 _로 대체 가능
실행할 코드
반복 작업을 효율적으로 처리하는 구문
1-1. for
1-1-1. range()
지정된 범위의 수를 생성하는 함수
- 반복 횟수가 명확할 때 사용
(1) 인자가 한 개
range(stop)- 0부터 시작해서 stop(끝값) - 1(인자로 전달된 값)까지 값에 대한 반복
- stop 값은
포함 X
(2) 인자가 두 개
range(start, stop)- start(
시작값)부터 시작해서 stop - 1 값까지에 대한 반복 - start의 기본값은
0
for i in range(2, 6):
print(i)
# 2
# 3
# 4
# 5
(3) 인자가 세 개
range(start, stop, step)- start부터 stop을 지나치기 전까지 step(
증가값)만큼 더해 반복 - 수 간의 간격인 step의 기본값은
1
# 예제1 (`양수` step)
for i in range(1, 10, 2):
print(i)
# 1
# 3
# 5
# 7
# 9
# 예제2 (`음수` step, B부터 A까지 1씩 감소하는 모든 값 출력)
A, B = map(int, input().split()) # 2 5
for i in range(B, A - 1, -1):
print(i, end=' ')
# 5 4 3 2
1-2. while
while 조건:
실행할 코드
주어진 조건이 참인 동안 계속 코드를 실행하는 반복문
# 예시1 (1부터 시작해 값을 2배씩 증가시키면서 x보다 작을 때까지 반복)
x = 100
num = 1
while num < x: # num이 x보다 작으면 계속 실행 (num이 x 이상이 되는 순간 반복 멈춤)
print("현재 값:", num)
num *= 2 # 반복이 진행될수록 num 값은 2배씩 증가
# 예시2
n = 10
while n > 2:
n -= 2
print(n) # 2
- 몇 번 반복할지 중요하지 않고, 조건을 만족(참)하는 동안
계속반복 진행 (<-> if 문은 조건이 참일 때 코드 한 번 실행) - 반복 횟수가 명확하지 않을 때, 조건이 언제 거짓이 될지 모르거나 참인 조건이 유지되는 시점까지 계속 반복해야 할 경우 사용 (≈if 문의 반복 실행)
- 반복 조건이 언젠가 거짓이 되도록 로직을 설계해야 무한 반복을 방지 가능
1-2-1. 무한 루프
조건이 항상 참이라 종료되지 않는 루프
- 사용자가 프로그램을 강제로 종료하지 않는 이상 계속 출력
while True:
print("무한 루프")
# 무한 루프
# 무한 루프
...
...
while n != 1: # n이 1이 될 때까지 반복
...
1-2-2. 무한 루프 탈출법
(1) break문
반복문을 즉시
종료시키는 제어문
- 특정 조건을 만족하면 반복문 전체를 중단
# 예시 1
while True:
user_input = input("종료하려면 'exit'를 입력하세요: ")
if user_input == "exit":
break
print("입력한 값:", user_input) # 사용자가 'exit' 입력하면 루프 종료하고, 그렇지 않으면 입력한 값 출력
# 예시2 (num이 3인 경우, 반복문 종료)
for num in range(1, 6):
print(f"{num}번째 반복문 시작")
if num == 3: # num이 3이 되는 순간
break # 반복문 종료
print(num)
# 출력:
# 1번째 반복문 시작
# 1
# 2번째 반복문 시작
# 2
# 3번째 반복문 시작
(2) 조건 활용
- while 문의 반복 조건 설정으로 break 문 없이 반복을 종료
- 특정 조건이 만족될 때까지만 반복 계속 (유동적인 반복 횟수 설정)
num = -1
while num <= 0:
num = int(input("양수를 입력하세요: ")) # 양수를 입력하면 루프 종료하고, 맨 마지막 출력문 실행
if num <= 0:
print("양수가 아닙니다. 다시 시도하세요.")
print("입력한 양수:", num)
(3) 사용자 입력
- 사용자 입력에 따라 반복을 계속하거나 종료
correct_password = "python123"
attempts = 0
max_attempts = 3
while attempts < max_attempts:
password = input("비밀번호를 입력하세요: ")
if password == correct_password:
print("로그인 성공!")
break
else:
attempts += 1
print(f"비밀번호가 틀렸습니다. {max_attempts - attempts}회 남았습니다.")
else:
print("로그인 시도 횟수를 초과했습니다.")
1-3. 반복문 흐름 제어
1-3-1. continue
현재 반복을
건너뛰고다음 반복으로넘어가게 하는 제어문
# 예시1 (num이 짝수인 경우만 반복을 넘길 때)
for num in range(1, 6):
print(f"{num}번째 반복문 시작")
if num % 2 == 0:
continue
print(num)
# 출력:
# 1번째 반복문 시작
# 1
# 2번째 반복문 시작
# 3번째 반복문 시작
# 3
# 4번째 반복문 시작
# 5번째 반복문 시작
# 5
# 예시2 (num이 음수나 0이면 건너뛰고, 양수일 때만 출력)
numbers = [10, -5, 7, -3, 0, 12, -1]
print("양수 목록:")
for num in numbers:
if num <= 0:
continue
print(num)
# 출력:
# 양수 목록:
# 10
# 7
# 12
1-4. 이중 for문
하나의 for 문 안에 또 다른 for 문을 중첩하는 반복문
for i in range(반복횟수 1):
for j in range(반복횟수 2):
# 반복되는 코드
- 2차원 구조나 반복이 필요한 복잡한 패턴 쉽게 처리 가능
# 예시 1
for i in range(100): # 아래 반복문을 100번 반복
for j in range(1, 101): # 1부터 100까지 반복
print(j, end=" ")
print() # 한 줄 출력 후 줄바꿈
1-4-1. 외부에 변수
- 변수 선언: 외부 for문
외부 - 변수 초기화: 반복문 시작 전 딱 한 번
- 변수 누적: 모든 반복 과정 / 이중 for 문 전체에서 유지 / 전체 반복을 통틀어 누적
total_cnt = 0 # 외부 for문 전에 변수 선언
for i in range(3): # 외부 반복문
for j in range(5): # 내부 for문
total_cnt += 1
print(f"전체 반복 횟수: {total_cnt}") # 15 (외부 3번 실행 x 내부 5번 실행 = 15번 반복)
1-4-2. 내부에 변수
- 변수 선언: 외부 for문
내부 - 변수 초기화: 외부 for 문이 반복될 때마다 / 내부 for 문이 한 번 돌 때마다 새로 생성
- 변수 누적: 각 외부 for 문마다 (반복이 시작될 때마다) 독립적으로 계산(초기화)
- 각 외부 for 문에서 내부 for 문이 몇 번 반복했는지 개별 기록 가능
- 루프별 합계
for i in range(3): # 외부 반복문
cnt = 0 # 외부 반복문이 돌 때마다 cnt를 0으로 초기화 (내부 변수 선언)
for j in range(5): # 내부 반복문
cnt += 1
print(f"{i}번째 외부 for문에서의 내부 for문 반복 횟수: {cnt}") # 5 (각 (외부 for 문이 시작될 때)마다 0으로 초기화되고, 내부 for 문이 5번 실행될 때마다 5로 증가(계산됨))
1-4-3. 별표 패턴 출력
- 세로로 3칸, 가로로 6칸 모양의 별표 패턴 출력하기
- 외부 반복문은 총 6번 실행되고, 한 번 실행될 때마다 내부 반복문이 3번 실행됨
(1) 내부 반복문
열(column)제어
이미지을 불러올 수 없습니다.
for j in range(cols):
print('*', end=" ")
(2) 외부 반복문
- 내부 for 문의 반복 작업 제어
행(row)제어
이미지을 불러올 수 없습니다.
# 예시 1 (내부 반복문에서의 continue)
for i in range(rows):
(내부 반복문)
print()
1-4-4. 2차원(이중) for 문에서의 흐름 제어
(1) continue
현재 반복(실행중인 반복문에서의 이번 반복)만 건너뛰고, 다음 나머지 반복을 계속 진행하도록 하는 제어문
- 이중 for문에서는, continue가 속해 있는 가장 안쪽 for 문의 반복만 건너뛰고, 외부 반복문은 계속 진행됨
for i in range(1, 4): # 외부 반복문 (i는 1부터 3까지)
for j in range(1, 6): # 내부 반복문 (j는 1부터 5까지)
if j == 3:
continue # j가 3일 때, 내부 for문의 이번 반복만 건너뜀
print(f"i={i}, j={j}") # j가 3일 때만 건너뛰어 print를 실행하지 않음
# 출력
"""
i=1, j=1
i=1, j=2
i=1, j=4
i=1, j=5
i=2, j=1
i=2, j=2
i=2, j=4
i=2, j=5
i=3, j=1
i=3, j=2
i=3, j=4
i=3, j=5
"""
# 예시 2 (외부 반복문에서의 continue)
for i in range(1, 4): # 외부 반복문 (i는 1부터 3까지)
if i == 2:
continue # i가 2일 때, 외부 for문의 이번 반복만 건너뜀
for j in range(1, 6): # 내부 반복문 (j는 1부터 5까지)
print(f"i={i}, j={j}")
# 출력
"""
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i=1, j=5
i=3, j=1 # i == 2일 때만 건너뛰어 출력 X
i=3, j=2
i=3, j=3
i=3, j=4
i=3, j=5
"""
(2) break 문
해당 반복문(내부 or 외부) 전체를 즉시 종료하는 제어문
- 이중 for 문에서는 break가 속해 있는 가장 안쪽 for 문을 즉시 종료하고 바깥쪽으로 빠져나감
- 내부 반복문에서 break를 만나면 내부 반복문만 종료하고 외부 반복문은 계속 진행
- 외부 반복문에서 특정 조건을 만족했을 때, break 사용하면 그 시점에 전체 이중 반복문 종료
# 예시 1 ( 내부 반복문에서의 break)
for i in range(1, 4): # 외부 반복문 (i는 1부터 3까지)
for j in range(1, 6): # 내부 반복문 (j는 1부터 5까지)
if j == 3:
break # j가 3이 되는 순간, 내부 반복문 자체를 완전히 종료
print(f"i={i}, j={j}")
# 출력
"""
i=1, j=1
i=1, j=2
i=2, j=1
i=2, j=2
i=3, j=1 # 외부 반복문은 i=2, i=3 일때 계속 진행 (내부 반복문은 매번 처음부터 다시 시작)
i=3, j=2
"""
# 예시 2 (외부 반복문에서의 break)
for i in range(1, 4):
print(f"[외부 반복문 시작] i={i}")
if i == 2:
break # 외부 반복문에서 i가 2가 되는 순간, 곧바로 전체 반복 종료 (i=1 일 때의 내부 반복문만 실행)
for j in range(1, 6):
print(f" i={i}, j={j}")
# 출력
"""
[외부 반복문 시작] i=1
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i=1, j=5
[외부 반복문 시작] i=2
"""
1-4-5. 가운데 정렬된 삼각형
n = 5
for i in range(1, n + 1):
# 공백 출력
for j in range(n - i):
print(" ", end=" ") # 첫 줄은 8개의 공백(공백 2개씩 4번)과 1개의 별 출력, 두 번째 줄은 6개의 공백(공백 2개씩 3번)과 3개의 별 출력,..
# 별 출력
for j in range(2 * i - 1):
print("*", end=" ")
print()
"""
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
"""
1-4-6. 세로로 정렬된 구구단 출력
for i in range(2, 10):
for j in range(1, 10):
print(f"{i} x {j} = {i*j}")
print("-" * 20)
"""
2 x 1 = 2
2 x 2 = 4
...
2 x 9 = 18
--------------------
...
9 x 9 = 81
--------------------
"""
1-4-7. 정상적인 구구단
(1) 문제: 정수 N의 값이 주어지면 N x N 모양 구구단 출력 (2) 입력: 첫 번째 줄에 N 주어짐 (3) 출력: N의 값에 따른 구구단을 입출력 예제처럼 출력 (4) 예제
# 입력
3
# 출력
1 * 1 = 1, 1 * 2 = 2, 1 * 3 = 3
2 * 1 = 2, 2 * 2 = 4, 2 * 3 = 6
3 * 1 = 3, 3 * 2 = 6, 3 * 3 = 9
(5) 풀이:
# 풀이1
N = int(input())
for i in range(1, N + 1):
for j in range(1, N + 1):
print(f"{i} * {j} = {i * j}", end="")
if j != N: # 마지막이 아닐 때만 콤마+공백 출력
print(", ", end="")
print()
# 풀이2
n=int(input())
for i in range(1,n+1):
for j in range(1,n+1):
if j < n:
print(f"{i} * {j} = {i*j}",end=", ")
else:
print(f"{i} * {j} = {i*j}",end="")
print()
1-5. 퀴즈
1-5-1. 짝수만 거꾸로 출력하기
(1) 문제: N개의 정수가 주어질 때, 입력에서 주어진 순서의 역순으로 짝수만 출력 (2) 입력: 첫 줄에 정수 N, 그 다음 줄에 N개의 정수가 차례대로 공백으로 구분되어 주어짐 (3) 출력: 첫 줄에 N개의 정수 중 짝수만, 주어진 순서의 역순으로 출력 (4) 예제
# 입력
6
3 1 4 5 6 2
# 출력
2 6 4
(5) 풀이
# 풀이1
N = int(input())
nums = list(map(int, input().split())) # map 함수로 감싸면 리스트가 아닌 map 객체가 됨
for num in nums[::-1]: # map 객체는 슬라이싱 불가
if num % 2 == 0:
print(num, end=" ")
# 풀이2
N = int(input())
nums = list(map(int, input().split()))
for num in reversed(nums):
if num % 2 == 0:
print(num, end=" ")
1-5-2. 친근하지 않은 수
(1) 문제: 1이상 N 이하의 정수 중 친근하지 않은 수의 개수를 출력, 이때 친근한 수는 2, 3 또는 5로 나누어 떨어지는 수이다. (2) 입력: 첫 번째 줄에 정수 N이 주어짐 (3) 출력: 첫 번째 줄에 1이상 N 이하의 수 중 친근하지 않은 수 개수 출력 (4) 예제:
# 입력
10
# 출력
2
(5) 풀이
# 풀이1
N = int(input())
cnt = 0
for i in range(1, N + 1):
if i % 2 and i % 3 and i % 5:
cnt += 1
print(cnt)
# 풀이2
N = int(input())
cnt = 0
for i in range(1, N + 1):
if i % 2 == 0 or i % 3 == 0 or i % 5 == 0:
continue
cnt += 1
print(cnt)
1-5-3. 배수의 개수
(1) 문제: 10개의 수가 주어질 때, 3의 배수의 개수와 5의 배수의 개수 출력 (2) 입력: 입력으로 10개의 수가 한 줄에 하나씩 주어짐 (3) 출력: 첫 번째 줄에 3과 5의 배수의 개수를 공백을 사이에 두고 출력 (4) 예제:
# 입력
7
42
10
54
34
55
57
60
30
50
# 출력
5 5
(5) 풀이:
# 예시1
cnt_3 = cnt_5 = 0
for _ in range(10):
n = int(input())
if n % 3 == 0:
cnt_3 += 1
if n % 5 == 0:
cnt_5 += 1
print(cnt_3, cnt_5)
# 잘못된 예시1
cnt_3 = cnt_5 = 0
for _ in range(10):
n = int(input())
if n % 3 == 0:
cnt_3 += 1
elif n % 5 == 0: # 바로 위의 if문이 참이면 elif 문은 실행 하지 않음
cnt_5 += 1
print(cnt_3, cnt_5)
# 잘못된 예시2
cnt_3 = cnt_5 = 0
nums = map(int, input()) # 수를 한줄로 1개만 받음
for num in nums:
if num % 3 == 0:
cnt_3 += 1
elif num % 5 == 0:
cnt_5 += 1
print(cnt_3, cnt_5)
1-5-4. 0 나올때까지 출력
(1) 문제: 정수를 계속 입력받다가 0이 입력되기 전까지의 결과를 그대로 출력 (2) 입력: 입력으로 몇 개의 줄이 들어올지는 정해져 있지는 않으며, 각 줄에는 하나의 정수가 주어진다. (그 중 적어도 하나는 0임을 가정해도 좋음) (3) 출력: 0이 주어지기 전까지의 결과를 한 줄에 하나씩 순서대로 출력 (4) 예제:
# 입력
3
5
0
# 출력
3
5
(5) 풀이:
while True: # 언제 끝날지 모르므로 계속 반복
n = int(input()) # 변수 선언 (반복문 밖에 -1보다 효율적)
if n == 0:
break
print(n) # n이 0이 아닌 경우에 계속 값 출력
1-5-5. A 부터 B 까지
(1) 문제: 정수 A부터 B까지의 수를 출력하기. A에서 시작하여 조건에 맞춰 수를 변경하다 B보다 커지는 순간에 종료해야 하며, 수가 바뀌는 조건은 다음과 같다.
- 수가 홀수일 땐 2배가 된다.
- 수가 짝수일 땐 3만큼 증가 (2) 입력: 첫 번째 줄에 정수 A, B가 공백을 사이에 두고 주어짐 (3) 출력: 첫 번재 줄에 수들을 공백을 사이에 두고 출력한다. A에서 시작하여 순서로 출력하되, B를 넘기 전까지만 출력 (4) 예제
# 입력
2 13
# 출력
2 5 10 13
(5) 풀이:
A, B = map(int, input().split())
while True:
print(A, end=" ")
if A % 2:
A *= 2
else:
A += 3
if A > B:
break
[코드트리 추천 링크] https://www.codetree.ai/ko/trail-info?referralCode=th2gr22n
댓글 0
아직 댓글이 없습니다.