[Python] for문
🤭 for문
1. 반복문?
for문은 기본적으로 반복을 할 수 있도록 하는 기능이 있다. 사용법은 여러가지지만 일단 가장 기초적인 사용 방법을 보자!
for i in range(10):
print("bang")
range()
에 설정된 숫자만큼 i를 반복하겠다는 뜻이다. 즉, i = 0
부터 i = 9
까지 숫자를 생성해서 반복을 한다.
for i in range(10):
print(i)
# 결과값
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
0부터 시작하기 때문에 10이 아니라 하나 작은 수만큼 반복한다고 이해하면 쉽다.
2739: 구구단
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하되, 출력 형식에 맞춰서 출력하면 되는 간단한 문제다. N은 1보다 크거나 같고, 9보다 작거나 같다는 조건이 있고, N 값으로 무엇이 들어오든 우리는 N1 부터 N9 까지 형식에 맞춰서 출력하면 된다.
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
위와 같이 출력하라고 하는데 이 때 formating 에 대해 알고 넘어가면 좋을 것 같다. 파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 수 있다. 파이썬 3.6 미만 버전에서는 사용할 수 없는 기능이므로 주의해야 함.
쉽게 말해 문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법이다.
문자열 포맷 코드
- %s : 문자열(String)
- %c : 문자 1개(character)
- %d : 정수(Integer)
- %f : 부동소수(floating-point)
- %o : 8진수
- %x : 16진수
- %% : Literal % (문자 % 자체)
print("I eat {0} apples".format(3))
print("I eat {0} apples".format("five"))
number = 3
print("I eat {0} apples".format(number))
print("I eat {0} apples".format(3))
number = 10
day = 'three'
print("I ate {0} apples. so I was sick for {1} days.".format(number, day))
# 이름으로 넣기
print("I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3))
# Index와 이름 혼용
다시 구구단 문제로 돌아와서 문자열 포맷 코드까지 적용해주면
num = int(input())
for i in range(10):
print("{0} * {1} = {2}".format(num, i, num*i))
이 정도로 정리가 되는데 여기의 함정은 이 문제에서 i가 0이 되는 일이 없다는 것임. 결과값을 보면 곱셈은 1부터 9까지 이루어진다. 따라서 이제 0을 배제하는 방법을 찾아야 해!
num = int(input())
for i in range(1, 10):
print("{0} * {1} = {2}".format(num, i, num*i))
위 코드와 같이 range는 시작점을 설정할 수 있다! range(1, 10)
으로 설정하면 1부터 9까지 계산된다.
10950: A+B - 3
그러니까 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 그리고 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
그러면 T에 입력 받은 숫자만큼 반복을 하도록 만들면 되나? 해보자...
t = int(input())
for i in range(t):
a, b = map(int, input().split())
print(a+b)
반복을 돌 때마다 값을 새로 입력 받도록 해야 한다.
8393: 합
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하는 문제다. 문제는 그 n의 범위가 (1 ≤ n ≤ 10,000)임.
n = 5인 경우 1 + 2 + 3 + 4 + 5
n = 10인 경우 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
즉, 주어진 n만큼 반복을 하면서 1씩 증가하는 값을 모두 더해야 한다.
num = int(input())
hap = 0
for i in range(1, num+1):
hap = hap + i
print(hap)
range(1, num)
으로 설정하면 1부터 주어진 nun - 1
까지 더하게 되기 때문에 num + 1
로 설정해야 원하는 값을 구할 수 있다.
2742: 기찍 N
이 문제 이전에 찍기 N이라는 문제가 있었는데 그건 n을 입력하면 1부터 n까지 순차적으로 +1씩 증가시켜 전부 출력하는 쉬운 문제였다. 그리고 이 기찍 N이라는 문제는... 예상대로 n부터 1까지 -1씩 감소시켜 전부 출력하는 문제다.
어떻게 감소시킬 수 있을까?
num = int(input())
for i in range(num, -1):
print(i)
위 코드는 그냥 내가 때려 맞추려고 짠 코드다. num 부터 -1씩 이라고 명시해주면 어쩐지 거꾸로 카운팅이 될 것 같았는데. 응 실패.
num = int(input())
for i in range(num, 0, -1):
print(i)
정답은 위와 같다. range(num, 0, -1)
이런 식으로 시작 숫자, 도달 숫자, 감소폭 순서로 적어주면 되는데 0 대신 -1을 넣으면 0까지 -1씩 감소하는 것을 볼 수 있다.
아니면 아래와 같은 방법도 있음.
num = int(input())
for i in reversed(range(0, num)):
print(i)
reversed(range())
를 사용할 수도 있음!
2438: 별 찍기 1
드디어 별을 찍는구나...
*
**
***
****
*****
몇 줄을 찍을 건지 숫자를 입력하고 해당 숫자만큼 별을 찍으면 된다.
num = int(input())
for i in range(1, num+1):
print("*" * i)
파이썬에서는 다음과 같은 출력이 가능하다.
# 01
string = 'string'
print(string * 4)
# 02
print('string' * 4)
stringstringstringstring
2439: 별 찍기 2
별 찍기 1번과 달리 이 문제에서 찍어야 하는 별은 다음과 같다.
*
**
***
****
*****
num = int(input())
for i in range(num):
print(" "*(num-1-i) + "*"*(i+1))
이게 가장 간단한 코드라는 것이 믿기지 않는다... 정말 이렇게 복잡하게 짜야 한다고? 정말?
2. 그 외의 for문
range를 이용한 반복문 말고도 list를 이용한 for문도 있다. 이 부분은 추후 list에 대해 공부할 때 조금 더 자세히 다룰 예정이다.
😳 생각해 볼만한 문제
10871: X보다 작은 수
정수 N개로 이루어진 수열 A와 정수 X가 주어질 때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하는 문제인데 일단 내가 생각할 때 중요한 부분은 X보다 작은 수를 수열 A에서 추출할 때 순서대로 출력하라는 말이 없으니까 이건 정렬을 안 해도 된다. 그냥 수열을 처음부터 끝까지 돌면서 확인하고 X보다 작은 경우 출력하면 되는 것임.
10 5
1 10 4 9 2 3 8 5 7 6
List를 이용하면 아래와 같이 풀 수 있다.
n, x = map(int, input().split())
a = input()
li_a = a.split()
answer = []
for a in li_a:
if int(a) < x:
answer.append(a)
answer = " ".join(answer)
그런데 list comprehension
을 쓰면 더 짧게 할 수 있다는 말에 혹해서 한 번 해보기로 함.
list comprehension
리스트 내부에 코드를 작성하는 것이다. 기존에 아래와 같은 코드가 있다고 가정하자. 1부터 10까지 정수를 numbers 리스트에 집어넣는 반복문이다.
numbers = []
for n in range(1, 10+1):
numbers.append(n)
위 코드를 list comprehension으로 작성하면 아래와 같이 쓸 수 있다.
[x for x in range(10)]
짧고 행복하다. comprehension 코드를 보면 기본적으로 코드 전체를 [ 리스트 ]가 감싸고 있다.
list comprehension
은 for문
에서 반복되는 변수를 :콜론
다음에 줄을 바꿔 들여쓰는 것이 아니라, for문
앞에 작성한다. x는 for문 내부에서 append 메소드
에 인자로 넣은 변수 n
과 같다. 만약 2의 배수를 10개 가지고 있는 리스트를 comprehension을 사용해 작성하면 아래와 같다.
[ 2*x for x in range(1, 10+1) ]
조건문을 붙일 수도 있다. List 파트로 넘어가면 comprehension 코드
에 대해 더 자세하게 알아볼 예정이라 list comprehension
에 조건문을 붙이는 연습은 넘어가서 하려고 했는데 이 문제에 조건문이 걸려 있어서 어쩔 수가 없다.
문제로 돌아와 list comprehension
을 사용해서 풀면 다음과 같이 풀 수 있다.
n, x = map(int, input().split())
a = input()
li_a = a.split()
answer = [i for i in li_a if int(i) < x]
print(" ".join(answer))
그런데 또 괜히 리스트를 안 쓰고 풀고 싶다는 생각이 들어서 그것도 해보기로 함. 물론 리스트를 쓰는 것이 훨씬 좋은 선택이니까 굳이 이렇게 할 필요는 없다. 그냥 해보고 싶어져서 하는 것임. 궁금하니까.
아 다음에 하겠습니다~~
Author And Source
이 문제에 관하여([Python] for문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyesech/Python-for문저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)