[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 comprehensionfor문에서 반복되는 변수를 :콜론 다음에 줄을 바꿔 들여쓰는 것이 아니라, 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))

그런데 또 괜히 리스트를 안 쓰고 풀고 싶다는 생각이 들어서 그것도 해보기로 함. 물론 리스트를 쓰는 것이 훨씬 좋은 선택이니까 굳이 이렇게 할 필요는 없다. 그냥 해보고 싶어져서 하는 것임. 궁금하니까.

아 다음에 하겠습니다~~

좋은 웹페이지 즐겨찾기