Responsive Advertisement
{getContent} $results={6} $label={recent} $type={grid}

파이썬 프로그래밍 - while, break, 구구단 출력, 소수 판별기

파이썬의 반복문에는 for문과 while문이 있습니다. for문이 버무이 기반으로 반복을 수행한다면, while은 특정 조건을 기준으로 실행되는 반복문입니다. 이번 글에서는 while문의 사용법, 구구단 출력 프로그램, 소수 판별기 프로그램에 대해 알아보겠습니다.

while문

while문은 조건을 기반으로 하는 반복문입니다. 조건이 참(True)인 동안 실행됩니다. 사용 시 다음 두 가지에 주의하면서 반복문을 작성해 주세요.

  • 조건을 명확히 명시하기: 조건이 모호하면 무한 반복되는 루프에 빠질 수도 있어요.
  • 반복문 탈출 조건 추가하기: 반복문 내부에서 반복문을 실행하기 위한 조건이 변경되지 않으면 반복문을 탈출할 수 없습니다. 반복문이 끝나지 않으면 프로그램도 종료되지 않아요. 그래서 반복문을 탈출할 수 있는 조건을 만들어주어야 합니다.

기본 문법 구조

while 조건:
    실행할 코드

기본 문법 구조를 바탕으로 1부터 5까지 카운트하는 반복문을 작성해 보겠습니다.

1부터 5까지 카운트하기

count = 1
while count <= 5:
    print(f"현재 카운트: {count}")
    count += 1  # 탈출 조건 설정

실행 결과

현재 카운트: 1
현재 카운트: 2
현재 카운트: 3
현재 카운트: 4
현재 카운트: 5

반복문의 탈출 조건은 1로 시작한 count가 5가 될 때까지 반복이기 때문에, count가 증가하도록 반복문 내부에 코드를 작성해 주어야 합니다.

구구단 출력 프로그램

구구단을 출력하기 위해 for문에서 중첩된 반복문을 사용했습니다. while문을 이용해서도 구구단을 출력해 볼 텐데요. 2단을 먼저 출력해 볼게요.

2단 출력하기

# 2단 출력 (while문)
i = 1
while i < 10:
    print(f"2 x {i} = {2 * i}")
    i += 1

  • i는 곱해지는 수가 되어 반복문 내에서 증가하게 됩니다.
  • 1로 설정된 i가 i<10인 조건에서 반복문을 실행합니다.
  • 반복문 내에서 i가 곱해지는 수로 출력되고 나면 1증가됩니다.
  • i<10의 조건을 만족하면 반복문을 계속 이행하고, i가 10이 되는 순간 반복문을 종료합니다.

2단~9단 출력하기

2단에서 9단까지 출력하기 위해선 단수와 곱해지는 수가 모두 순서에 따라 증가해야 하기 때문에 2개의 변수를 활용한 중첩 반복문으로 작성해 보겠습니다.

i = 2  # 단 초기화
while i <= 9:
    j = 1  # 곱해지는 수 초기화
    while j <= 9:
        print(f"{i} x {j} = {i * j}")
        j += 1  # 안쪽 반복문 탈출 조건
    i += 1  # 바깥쪽 반복문 탈출 조건
    print()  # 단별 출력 간 공백 추가

바깥쪽 반복문은 단수를 나타내는 i를 조건의 변수로 합니다. 2부터 9까지 반복합니다.

안쪽 반복문은 곱해지는 수를 나타내는 j를 조건의 변수로 합니다. 1부터 9까지 반복합니다.

안쪽 반복문이 종료될 때 i는 1증가되고 바깥 반복문의 조건이 종료되지 않는다면(i<=9) 안쪽 반복문을 새롭게 이행하기 위해 j는 다시 1로 초기화되어야 합니다.

break와 소수 판별기

break는 반복문을 강제로 종료시킬 때 사용합니다. 반복문 내에서 조건의 변화를 관찰하다가 특별한 조건을 충족하면 추가 반복 작업을 이행하지 않고 탈출할 때 사용합니다. 소수 판별기를 작성하면서 살펴보겠습니다.

소수의 개념

소수(Prime Number)는 1과 자기 자신만을 약수로 갖는 자연수를 말합니다. 2, 3, 5, 7, 11,...과 같은 수입니다. 작은 수에서는 간단한 계산으로도 소수를 찾을 수 있지만, 수가 커질수록 약수를 가늠하기 어려워지기 때문에 프로그램의 반복 작업으로 구하는 것이 사람이 계산하는 것보다 빠르기도 합니다. 

소수 판별기

100이하의 소수를 출력하는 프로그램을 작성하려고 합니다. 그런데, 소수 20개가 출력되면 프로그램이 종료되도록 만들 것입니다. 종료 조건이 두 가지로 나타나게 됩니다. 소수인지를 검증하는 자연수가 100을 넘거나, 검출된 소수의 개수가 20개를 넘거나.

코드 작성

n = 2  # 2부터 시작 (소수는 2부터 시작)
count = 0  # 소수 개수 카운트
primenum = [] # 소수로 판별된 수를 리스트로 저장

while n <= 100:
    is_prime = True  # n이 소수인지 판별하기 위한 변수
    i = 2
    while i < n:
        if n % i == 0:
            is_prime = False
            break  # 나누어 떨어지면 소수가 아님. 반복문을 탈출
        i += 1
    
    if is_prime:
        primenum.append(n)
        count += 1
        if count == 20:
            break  # 소수 20개 찾았으면 종료
    else:
        print(f'{n}은/는 {i}(으)로 나뉘어짐. 소수가 아님.')
    n += 1

print(primenum)

코드 설명

원리는 자연수 n을 2부터 증가하는 i로 나누어서 나누어 떨어지는지를 판별하는 것입니다. 만약에 나누어떨어진다면 i라는 1이 아닌 약수가 존재하는 것이기 때문에 소수가 아닙니다. 나누어떨어지는 i가 하나라도 존재하면 그 즉시 n을 판별하는 반복문에서 break문을 사용하여 탈출하고 n다음 자연수를 판별합니다. 

만약 i가 n-1까지 증가하면서 n을 나누었을 때 나누어 떨어지는 수가 존재하지 않는다면 소수로 판별됩니다. is_prime이 True로 유지되고, primenum리스트에 해당 n을 추가합니다. count를 1 증가시켜 판별된 소수의 수를 셉니다. 만일 소수의 수가 20이라면 즉시 전체 반복문을 break로 탈출합니다.

실행 결과를 가시적으로 보이기 위해 is_prime이 False인 상태를 알리는 20번 줄의 출력문을 작성하였습니다. 최종적으로 반복문이 모두 종료되었다면 리스트를 호출하여 판별된 소수를 출력합니다.

소수 판별의 개선 아이디어

사실, 소수를 판별하기 위해 n을 n-1의 숫자까지 나누어볼 필요는 없습니다. 100이 소수인지를 알아보기 위해 99까지 나누어볼 필요는 없다는 뜻입니다. 당연히, 99로는 나누어지지 않으니까요. 

수학적으로 어떤 수가 두 자연수의 곱으로 표현될 수 있다면 둘 중 하나의 수는 반드시 해당 수의 제곱근 이하의 수가 됩니다. 말이 어렵지만, n이 소수인지를 판별하기 위해서는 n의 제곱근이하에 해당하는 자연수만 나누어보면 된다는 뜻입니다. 반복문을 수행할 범위가 확 줄어들기 때문에, 소수를 판별하기 위한 프로그램의 프로세스가 훨씬 경제적이게 됩니다.

마치며

while문과 for문을 이용한 반복문도 프로그래밍 과정에 정말 중요한 요소입니다. 두 반복문 중 내가 작성하는 프로그램에는 어떤 반복문이 적절할지 다양한 예제를 통해 익숙해 지면 좋을 것 같습니다. 

{getContent} $results={5} $label={recent} $type={block}