제어문 3

기타 제어문에 대해 배우는 글입니다.

기타 제어문 - break, continue

break

break문은 단어 그대로 멈춘다는 기능을 가지고 있습니다. break는 어떤 조건에 해당하면 멈추고 다른 동작을 해야하는 문제가 많아서 반복문에서 if문과 함께 주로 쓰입니다.

break는 break문이 속해있는 루프를 중단하고 다음 동작을 진행합니다.

break문이 속해있는 루프를 중단하는 것이 무슨 말이냐면 아래와 같은 코드가 있으면 i = 1이고, for j in range(3)루프가 돌아갈 때 해당 for문만 멈추고, for i in range(3)은 계속 작동한다는 소리입니다. 그리고 다시 i = 2일 때 for j in range(3)이 돌아간다는 것이죠.

for i in range(3):
    for j in range(3):
        if i == 1: break
        print(i, j)

위 코드에 숫자를 대입해서 작동 과정을 살펴봅시다.

1) i = 0, j= 0 -> 출력

2) i = 0, j = 1 -> 출력

3) i = 0, j = 2 -> 출력

4) i = 1, j = 0 -> i = 1이므로 break문 때문에 for j in range(3) 전체가 동작하지 않고 for i in range(3) i = 2로 넘어감

5) i = 2, j = 0 -> 출력

6) i = 2, j = 1 -> 출력

7) i = 2, j = 2 -> 출력

0 0
0 1
0 2
2 0
2 1
2 2

x = 2
for i in range(10):
    print(x)
    if x > 10: break
    x = x * 3
print(123)

이 코드는 x에 계속 3을 곱하는 코드인데요. x에 3을 곱하다가 x의 값이 10 초과가 되면 for문을 탈출하는 기능을 가진 코드입니다.

출력은 2, 6, 18, 123이 나오는데 왜 18까지 나오는지 생각해보시면 좋을 것 같습니다.

2
6
18
123
# x = 18에서는 if문 때문에 for문을 탈출함

우리는 제어문 2에서 while문 무한 루프문을 배웠습니다. break문은 이 무한 루프를 탈출할 때 쓰이기도 합니다.

x = 1
while True:
    print(x)
    x += 1
    if x > 5: break
1
2
3
4
5

이렇게 보면 while에 붙이는 불리언 식과 break문이 같은 기능을 한다는 것을 알 수 있습니다.

x = 1
while x <= 5:
    print(x)
    x += 1

그냥 while 옆에 붙이는 불리언 식으로 모든 것을 하면 되지 않을까 생각할 수 있는데요.

불리언 식은 한 줄이기 때문에 루프 탈출 조건이 여러 개라면 한 줄로 엄청 길게 작성해야 합니다. 하지만 break문은 그만큼 새로 코드를 작성하면 되기 때문에 코드 분량은 많아지지만 가독성이 좋아지게 됩니다.

만약 a, b, c, d, e = 0, 0, 0, 0, 0인데 하나의 값이 100이 된다면 작동을 멈추는 프로그램을 while문으로 짜보면 아래와 같습니다.

a, b, c, d, e = 0, 0, 0, 0, 0

while not(a == 100 and b == 100 and c == 100 and d == 100 and e == 100):
    a += 1
    b += 2
    c += 3
    d += 4
    e += 5

break문을 사용하면 코드는 더 길어지지만 탈출 조건이 무엇인지 쉽게 이해할 수 있습니다.

a, b, c, d, e = 0, 0, 0, 0, 0

while True:
    if a == 100: break
    if b == 100: break
    if c == 100: break
    if d == 100: break
    if e == 100: break
    # 또는 if a == 100 or b == 100 or c == 100 or d == 100 or e == 100: break
    a += 1
    b += 2
    c += 3
    d += 4
    e += 5

여기서 a, b, c, d, e가 아닌 알파벳 소문자 26개를 모두 사용한다면 while 옆에 있는 불리언 식이 엄청 길어지겠죠. break문도 26줄을 사용해야 하겠지만 언제 탈출 할 수 있는지 쉽게 알아챌 수 있습니다.

이제 문제를 풀어보겠습니다.

A, B를 입력 받아 A+B를 출력하는 문제인데요. 그동안 봤던 문제들과 다르게 테스트 케이스 수가 주어지지 않고 입력의 마지막에는 0이 두 개 입력 받으면 종료를 한다고 합니다.

일단 break문을 제외하고 코드를 짜봅시다.

while True:
    A, B = map(int,input().split())
    print(A + B)

그리고 0이 2개 올 때 아무것도 출력하지 않고 종료하므로 print(A+B) 윗 줄에 break문을 만들어주면 됩니다.

while True:
    A, B = map(int,input().split())
    if A == 0 and B == 0: break
    print(A + B)

또 다른 문제를 풀어봅시다.

N을 입력 받아서 N킬로그램 설탕을 3킬로그램 봉지, 5킬로그램 봉지로 나눠 담으려고 할 때, 설탕을 나누어 담을 수 있는지 물어보는 문제입니다.

풀이 방법은 5킬로그램 봉지로 담는 것이 제일 이득이므로 5의 배수가 나올 때까지 n에서 3킬로그램을 빼주다가 5의 배수가 나오면 바로 5로 나눈 몫을 더하고 break문으로 탈출하는 방법을 사용해봅시다. 그리고 n이 3미만의 수가 되면 더 이상 봉지에 나누어 담을 수 없으므로 while문 옆에 불리언 식에 n이 3이상에서만 돌아갈 수 있도록 작성해줍니다.

n = int(input())
ans = 0 #봉지의 개수
while n >= 3:
    if n % 5 == 0:
        ans += n // 5
        n = 0
        break
    else:
        n -= 3
        ans += 1

그리고 이제 2킬로그램, 1킬로그램이 남는 경우에는 더 이상 나누어 담을 수 없으니 -1을 출력해야 합니다. while문을 빠져나오고 if / else문으로 비교를 하여 출력을 하면 되겠네요.

n = int(input())
ans = 0 #봉지의 개수
while n >= 3:
    if n % 5 == 0:
        ans += n // 5
        n = 0
        break
    else:
        n -= 3
        ans += 1
if n > 0:
    print(-1)
else:
    print(ans)

풀어볼 문제

continue

continue는 break와 비슷한 기능을 하지만 break문과 다르게 루프를 탈출하지 않고, 어떠한 조건에 해당하는 경우에만 건너뛰고 루프를 이어서 작동하는 역할을 해주는 기능입니다.

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

이 코드는 1부터 50까지 출력할 수 있는 함수입니다. 이걸 continue문을 활용하여 짝수만 출력하도록 만들어보면 아래 코드와 같습니다.

for i in range(1,51):
    if i % 2 == 1: continue
    print(i)

i를 2로 나눴을 때 나머지가 1이 나오는 숫자, 즉 홀수일 경우 continue를 이용하여 아래 줄에 있는 print(i)를 건너뛰고 다음 동작으로 넘어갑니다.

참고로 위에 내용은 그냥 for문으로 만들 수 있기도 합니다.

for i in range(2, 51, 2):
    print(i)

continue는 보통 다른 내용들과 함께 쓰이는 문제가 많아서 현재 풀을 문제가 거의 없습니다.

a와 b를 입력 받아서 본문에 나온 것 같이 숫자를 더한 값을 계속 곱해주는 문제입니다.

1부터 자연수 k까지의 합의 공식은 아래와 같습니다.

k×(k+1)2\frac{k \times (k+1)}{2}

위 공식과 for i in range(b+1), continue를 이용하여 코드를 작성해봅시다. i의 값이 0부터 b까지 나오므로 0부터 a-1까지는 continue를 이용하여 건너뛰어야 합니다.

14579로 나눈 나머지로 출력하는 것도 잊지 말아야 합니다. 그리고 ans = 0일 경우 어떤 숫자를 곱해주어도 값이 그대로 0이기 때문에 ans = 1로 작성합니다.

a, b = map(int,input().split())
ans = 1
for i in range(b+1):
    if i < a: continue
    ans = (ans * (i * (i+1) // 2)) % 14579
print(ans)

continue문은 나중에 continue를 사용하는 문제가 있으면 그때 풀어볼 예정입니다.

Last updated