2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 1 PCCE 시험 개요와 LV3 등급 분석
2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 2: 변수, 자료형, 연산자 – Python 기본 문법 ①
2025.05.23 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 3 조건문 – 흐름 제어 기초
반복 작업의 자동화 – 루프의 필요성
프로그래밍의 강력함은 컴퓨터가 반복적 작업을 인간 대신 빠르고 정확하게 해준다는 데 있습니다. 만약 1부터 100까지 숫자를 일일이 출력해야 한다면, 100줄의 print를 쓰는 대신 반복문(loop) 하나로 해결할 수 있죠. 이번 파트에서는 Python의 두 가지 기본 반복문인 while과 for에 대해 알아보고, PCCE Level 3 대비 관점에서 어떤 형태로 출제되는지 살펴보겠습니다. 반복문은 PCCE에서 매우 중요한 주제입니다. 별도의 반복문 문제가 출제될 뿐만 아니라, 다른 문제 (예: 리스트 처리, 구현 문제 등)에서도 반복문 활용은 필수이기 때문입니다. 특히 중첩 반복은 2차원 리스트나 패턴 출력 문제에서 자주 등장하니 집중해서 익혀봅시다.
while 루프와 for 루프
1. while 문: while은 조건을 만족하는 동안 계속해서 코드를 실행합니다. 구조는 다음과 같습니다:
# 코드 예시 |
while <조건식>: <반복 실행할 코드> |
조건식을 평가해서 True면 코드 블록을 실행하고, 실행이 끝나면 다시 조건을 검사합니다. 이 과정을 조건이 False가 될 때까지 반복합니다. 예를 들어:
# 코드 예시 |
count = 5 while count > 0: print(count) count -= 1 print("발사!") |
이 코드는 5부터 1까지 출력한 뒤 "발사!"를 출력합니다. count가 0이 되면 count > 0이 False가 되어 루프를 탈출합니다. 주의: while문은 조건이 언제 False가 될지 잘 제어해야 합니다. 그렇지 않으면 무한 루프에 빠질 수 있습니다. 위 예시에서 count -= 1이 없었다면 count가 영원히 5로 남아서 무한히 출력했겠죠. 따라서 while을 사용할 때는 루프 내부에서 조건을 변화시키는 코드가 필요합니다 (i 증가, 감소 등).
2. for 문 (파이썬): Python의 for문은 다른 언어의 for문과 약간 다릅니다. Python의 for는 시퀀스(iterable)의 각 원소를 차례로 꺼내어 루프를 도는 형태입니다. 가장 자주 쓰는 형태는 range()와 함께 쓰는 것입니다:
# 코드 예시 |
for i in range(5): print(i) |
이 코드는 0,1,2,3,4를 출력합니다. range(5)가 0부터 4까지의 연속된 정수를 생성하기 때문입니다. range(start, end) 형태로 쓰면 start부터 end-1까지, range(start, end, step)으로 쓰면 step 간격으로 증가하는 수열을 생성합니다. 예를 들어 range(1, 10, 2)는 1,3,5,7,9를 차례로 만들어냅니다.
Python for문의 또 다른 강력한 점은 리스트 등 컬렉션 직접 반복입니다:
# 코드 예시 |
fruits = ["apple", "banana", "cherry"] for fruit in fruits: print(fruit) |
각 루프에서 fruit 변수가 리스트의 다음 원소를 받아 "apple", "banana", "cherry" 순으로 출력합니다. 이런 방식을 리스트 순회라고 하며, PCCE에서도 1차원 리스트나 문자열을 for로 순회하는 문제가 자주 나옵니다.
3. 중첩 반복문: 반복문 안에 다시 반복문이 있는 구조를 말합니다. 흔히 이중 for문 형태로 2차원 데이터를 처리하거나 모든 쌍의 조합을 탐색하는 데 사용됩니다. 기본 구조는:
# 코드 예시 |
for i in range(N): for j in range(M): # i, j 두 변수에 대해 중첩된 작업 |
# 코드 예시 |
for i in range(5): for j in range(5): print("*", end="") print() # 줄바꿈 |
내부 루프가 별 5개를 찍고, 외부 루프가 이 과정을 5번 반복해 5행을 만듭니다. PCCE에서는 2차원 리스트 처리 (예: 행렬 덧셈, 주변 요소 탐색 등)에 이중 루프가 필요할 수 있고, 또한 간단한 도형 출력이나 패턴 문제도 출제될 수 있습니다.
4. 반복 제어: break와 continue:
- break는 반복문을 즉시 종료합니다. 중첩된 경우 가장 안쪽 루프 하나만 탈출합니다. (2중 루프 모두 탈출하려면 외부 루프에서도 break를 조건부로 호출해야 합니다.) 예를 들어, 1부터 숫자를 더해나가다가 합계가 100 이상 되면 중단하는 코드:이 코드는 break로 무한루프를 탈출하는 형태입니다. 시험에서는 보통 조건문으로 while을 제어하지, 무조건 True 후 break 방식은 덜 쓰지만, 경우에 따라 알고리즘 문제에서 break가 필요할 수 있습니다. (예: 탐색을 조기에 끝낼 때)
-
# 코드 예시 total = 0
num = 1
while True:
total += num
if total >= 100:
break
num += 1
print("누적합이 100을 넘은 시점:", num, "합계:", total) - continue는 반복문의 현재 반복을 건너뛰고 다음 반복으로 넘어가도록 합니다. 루프는 종료되지 않고, 해당 루프 바디의 나머지 부분을 스킵한 뒤 조건 검사→다음 반복으로 진행합니다. 예를 들어 1~10 중 짝수만 출력:n이 홀수이면 print를 건너뛰고 바로 다음 n으로 넘어가므로, 결과적으로 짝수만 출력됩니다.
-
# 코드 예시 for n in range(1, 11):
if n % 2 == 1:
continue
print(n)
5. 루프 vs 재귀: (참고) 반복을 구현하는 다른 방법으로 재귀 함수가 있지만, PCCE Lv3 단계에서는 주로 반복문으로 풀이를 기대합니다. 재귀는 Lv3 범위에 직접 언급되진 않으므로 여기서는 다루지 않겠습니다.
실습 예제 코드: 다양한 반복문 활용
여러 가지 반복문 활용 예제를 한 코드에 담아서 실습해보겠습니다. 간단한 것부터 차례로 살펴볼게요.
# 코드 예시 |
# 1. while문 기본: 1부터 5까지 합 구하기 total = 0 n = 1 while n <= 5: total += n n += 1 print("1~5 합계:", total) # 출력: 15 # 2. for문 기본: 구구단 2단 출력 for i in range(1, 10): print(f"2 x {i} = {2*i}") # 출력: 2 x 1 = 2 ... 2 x 9 = 18 # 3. 리스트 순회: 과일 이름 출력 fruits = ["Apple", "Banana", "Cherry"] for f in fruits: print("과일:", f) # 출력: 과일: Apple ... 과일: Cherry # 4. 중첩 for문: 좌표 찍기 (0~2 x 0~2) for x in range(3): for y in range(3): print(f"({x},{y})", end=" ") print() # 출력: (0,0) (0,1) (0,2) # (1,0) (1,1) (1,2) # (2,0) (2,1) (2,2) # 5. break 사용: 1~N 중 누적합이 50 이상 될 때 sum_val = 0 for k in range(1, 100): # 100은 넉넉하게 큰 수 설정 sum_val += k if sum_val >= 50: print("누적합 50 이상이 된 시점 k:", k, "합계:", sum_val) break # 출력: 누적합 50 이상이 된 시점 k: 10 합계: 55 # 6. continue 사용: 1~10 중 3의 배수 제외 출력 for m in range(1, 11): if m % 3 == 0: continue print(m, end=" ") # 출력: 1 2 4 5 7 8 10 |
코드를 부분별로 설명하겠습니다:
- 1번 (while): n이 1부터 5까지 증가하며 total에 더해집니다. 최종적으로 15를 출력하지요. 이 예제는 while 루프의 전형적인 패턴을 보여줍니다: 루프 변수(n)를 미리 선언, while 조건에서 사용, 내부에서 변수 변화 (n += 1). 이 세 요소가 잘 맞물려야 정확한 반복이 됩니다. PCCE에서도 while을 쓸 일이 있다면 이런 형태일 가능성이 높습니다 (예: 어떤 조건까지 누적, 특정 값 찾기 등).
- 2번 (for range): 구구단 2단은 for i in range(1,10)으로 1부터 9까지 i를 돌면서 2*i를 출력하면 됩니다. f-string을 사용하여 형식 맞춰 출력했습니다. PCCE에서 구구단 같은 형태의 출력 문제도 나올 수 있습니다. 중요한 것은 range 함수의 사용과, 루프 변수 i가 1부터 9까지 순서대로 변한다는 것을 이해하는 것입니다.
- 3번 (리스트 for): 리스트 fruits를 직접 순회하여 각 원소를 출력했습니다. Python에서는 이 방식이 가장 파이썬다운(list 등 iterable 직접 iterate) 방법입니다. 만약 인덱스가 필요하다면 for idx, f in enumerate(fruits):를 쓰거나 C 스타일로 for i in range(len(fruits)): 후 fruits[i]를 접근할 수 있습니다. 시험 준비 시에는 두 방법 모두 익혀두세요. 특히 enumerate는 (index, value) 쌍을 튜플로 줌으로써 인덱스가 필요할 때 유용합니다.
- 4번 (중첩 루프): 0부터 2까지 x, 0부터 2까지 y를 돌며 (x,y) 좌표를 출력했습니다. print(..., end=" ")를 사용하여 줄바꿈을 방지하고 공백으로 이어지게 한 뒤, 내부 루프가 끝난 후 print()로 줄바꿈을 넣었습니다. 이중 for문으로 3x3 격자의 좌표를 출력한 예입니다. PCCE의 2차원 리스트 문제는 이와 유사한 형태로 풀게 됩니다. 예컨대 5x5 보드의 모든 칸을 검사하려면 for i in range(N): for j in range(N): 구조를 써야 합니다. 이런 중첩에서 i와 j의 역할 (행과 열 인덱스)이 자주 나오므로 혼동 없이 이해해둡시다.
- 5번 (break): 1부터 숫자를 더해가다 누적합이 50 이상이면 break로 루프를 종료하는 예입니다. range(1,100)처럼 충분히 큰 범위를 잡아 놓고 도중에 break로 탈출하는 패턴입니다. 출력 결과를 보면 k=10일 때 합계 55로 50을 넘어서 종료되었음을 알 수 있습니다. break는 주로 필요한 결과를 얻었을 때 남은 반복을 건너뛰기 위해 사용합니다. 예컨데 탐색 문제에서 원하는 값을 찾으면 루프를 깬다거나, 조건을 만족하는 첫 번째 해답만 필요할 때 쓰죠. PCCE에서도 구현 문제에서 효율을 위해 break를 쓰는 상황이 있을 수 있습니다. (예: 특정 조건 만족시점 찾기)
- 6번 (continue): 1부터 10까지 수 중 3의 배수는 출력하지 않고 나머지만 출력하는 코드입니다. if m % 3 == 0: continue로 3의 배수인 경우 print(m)를 건너뛰도록 했습니다. 결과에서 3, 6, 9가 빠진 걸 볼 수 있죠. continue는 loop를 완전히 끝내진 않고 스킵만 한다는 점에서 break와 다릅니다. PCCE 문제를 풀 때, continue를 써도 되고 안 써도 되는 경우가 많지만, 간혹 쓰는 게 코드를 깔끔하게 해주는 상황이 있습니다. 예를 들어 여러 조건 중 "이러이러하면 이후 로직을 건너뛰고 다음 반복"이라는 요구가 있을 때 continue를 떠올리면 됩니다.
PCCE 출제 포인트 분석: 반복문 분야
PCCE에서 반복문은 다양한 방식으로 문제에 등장합니다. 중요한 포인트 및 실제 출제된 유형을 살펴보겠습니다:
- 기본 반복 패턴 묻기: 예를 들어 “1부터 N까지 합 계산” 같은 고전 문제는 while이나 for로 쉽게 풀 수 있습니다. PCCE Level 3에서는 너무 단순한 합계보다는 약간의 twist가 있을 수 있지만, 기본적으로 반복 구조를 정확히 짤 수 있는지를 확인합니다. sum 계산, 팩토리얼 계산, 일정 패턴 출력 등으로 출제될 수 있습니다. 이때 관건은 초기값, 조건, 증감을 올바르게 설정하는 것입니다. 디버깅 문제로 "while 루프의 조건이 잘못되어 무한루프가 된다"거나 "for 루프 범위가 잘못되어 일부 값이 누락된다"를 고치게 할 수 있으니, 반복문 작성 시 그 부분들을 늘 점검해야 합니다.
- 리스트 순회 및 누적 처리: 기출 문제 중에는 "리스트에 담긴 점수 중 최고점 찾기", "리스트 원소의 총합", "조건을 만족하는 원소 개수 세기" 등이 있습니다. 이러한 문제는 for 루프로 리스트를 순회하면서 답을 누적 계산하면 됩니다. 예를 들어, 점수 리스트에서 80점 이상 개수 세기는식으로 쉽게 해결되죠. PCCE는 이런 기본 알고리즘(최대/최소, 합계, 개수세기)을 구현할 줄 아는지를 많이 봅니다.
-
# 코드 예시 count = 0
for s in scores:
if s >= 80:
count += 1 - 이중 루프를 통한 2차원 데이터 처리: 앞서 Part 5(리스트)에서 더 자세히 다루겠지만, 2차원 리스트(행렬) 문제가 나오면 대개 이중 반복문으로 각 원소를 접근합니다. 예컨대 기출 9번 “이웃한 칸” 문제는 2D 그리드에서 특정 칸 주변에 같은 색이 몇 개 있는지 세는 내용인데, 이를 풀려면 행/열 2중 루프와 +상하좌우 offset 검사 등이 필요했습니다. 중첩 반복의 인덱스 관리와 경계 조건 처리 등이 포인트였죠. 이런 문제를 대비하려면, 평소 2차원 배열을 종이에 그리고 인덱스로 접근하는 연습을 해보는 것이 좋습니다. 예를 들어 5x5 배열에서 arr[i][j]의 상하좌우는 arr[i-1][j], arr[i+1][j], arr[i][j-1], arr[i][j+1]인데, i=0이나 j=끝인 경우는 index error가 나니 조건으로 걸러야 합니다. 이러한 반복+조건 조합 문제는 구현/시뮬레이션 유형(Part 8)과도 관련이 깊습니다.
- 특정 패턴 생성: 반복문은 무언가를 여러 번 출력하여 패턴을 만드는 데 쓰입니다. 대표적으로 별 찍기, 줄무늬 출력 등이 있는데, PCCE에서는 복잡한 별 찍기보다는 단순한 표나 합계 테이블 등을 물을 가능성이 있습니다. 예를 들어 “100부터 500까지 100단위로 늘어난 표 출력” 이런 식으로요. 이 경우 for문에 step을 주거나 while에서 +100씩 증가시키면 됩니다.
- 효율과 반복 횟수: PCCE는 시간 복잡도를 크게 따지는 시험은 아니지만, 너무 비효율적인 O(n^2) 알고리즘을 짰을 때 시간 내 해결이 안 될 수도 있습니다. Lv3 난이도에서는 입력 크기가 크진 않겠지만, 그래도 쓸데없는 반복을 피하는 버릇을 들이세요. 예를 들어 이미 찾은 값을 또 찾기 위해 루프를 돌지 말고, break를 적절히 활용하거나, 한 번의 루프로 처리할 수 있는 것을 이중 루프로 만들지 않는 것입니다. 수험생 후기에서도 "문제가 쉬워 보여도 모든 케이스를 다중 루프로 검사하면 시간 부족이 우려된다"는 조언이 있습니다. 다행히 Python으로 응시하면 내부 함수나 라이브러리를 활용해 성능을 높일 수도 있죠. (물론 시험에서는 기본 문법 범위 내에서 해결될 문제만 나오지만, 리스트 내장이나 내장 함수 sum, max 등을 써도 된다면 활용하세요. 다만, 문제 지시에 금지되어 있지 않은지 확인 필요.)
요약: 반복문은 틀릴 게 별로 없어 보이지만, 오히려 단순해서 실수하기 쉬운 영역입니다. 오프바이원(Off-by-one) 에러, 즉 1을 더하거나 빼는 부분에서 실수가 흔합니다. 예를 들어 range(5)와 range(6)을 혼동하거나, while 조건을 <=가 아닌 <로 쓴다든지요. 항상 머릿속으로 루프가 도는 횟수를 추산해보고, 작은 입력의 경우 직접 종이에 시뮬레이션을 해보세요.
마무리 요약 및 꿀팁
이번 파트에서는 반복문의 기본 구조와 사용법을 살펴봤습니다. Python에서 while과 for은 용도에 따라 선택하는데, 횟수가 명확하거나 시퀀스를 순회할 때는 for, 언제 끝날지 모르는 반복은 while이 적합합니다. PCCE 준비 단계에서는 두 가지 모두 능숙하게 다룰 수 있어야 합니다. 특히 중첩 루프와 break/continue 같은 제어문도 익혀두세요.
꿀팁:
- 표 그리기 연습: 이중 루프를 이해하는 좋은 방법은 손으로 표를 그리고 인덱스를 적어보는 것입니다. 3x3, 4x4 격자를 그려놓고 각 칸에 (i,j) 인덱스를 써보세요. 그러면 루프 변수가 어떻게 변하며 전체를 커버하는지 감이 잡힙니다. 이후 직접 그 좌표를 출력하는 코드를 짜보면 머리에 쏙 들어옵니다.
- 무한루프 디버깅: 코딩하다 보면 무한루프에 빠질 때가 있습니다. 이때는 루프 조건과 루프 내부 상태 변화를 확인해야 합니다. 시험장에서 혹시 무한루프에 빠진 코드(시간 초과)가 나오면, 흔히 while 조건이 잘못됐거나, break 조건이 절대 안 되는 상황일 겁니다. 예를 들어 while i != 10:인데 i가 10을 건너뛰어 증가한다면 영원히 멈추지 않겠죠. 또는 float 비교로 while을 돌리는 실수도 피하세요 (부동소수 오차로 딱 떨어지지 않아 무한 반복될 수 있음).
- 파이썬 내장 활용: 반복문을 쓸 때 꼭 손코딩하지 않아도 되는 경우가 있습니다. 예를 들어 리스트 합은 sum(list)로, 최댓값은 max(list)로 구할 수 있죠. 이런 내장 함수를 쓰면 실수를 줄이고 속도도 올릴 수 있습니다. 다만, 이를 남용하면 학습 효과가 떨어지니 원리를 이해한 후에 활용하세요. PCCE에서는 라이브러리 사용이 허용 범위 내라면 쓰셔도 감점 요인은 없습니다. 단, 문제마다 제한이 있을 수 있으니 문제 지문을 확인해야 합니다.
추천 연습 문제
- [PCCE 기출문제] 4번: 저축 – 어떤 금액을 월마다 저축하여 목표를 달성하는 시점을 구하는 문제. while 루프로 조건을 만족할 때까지 반복하는 로직이 필요합니다. (두 단계로 나눠 before/after 금액을 더하는 이중 while 구조였던 점에 유의)
- [PCCE 기출문제] 5번: 산책 – 2차원 평면에서 N,S,E,W 문자로 이루어진 경로를 따라간 최종 위치를 구하는 문제. for 루프로 문자열 문자를 순회하고, 조건문으로 이동 방향을 처리하는 연습이 됩니다.
- 코드업 1071~1073 (기초 1차원) – 다양한 while 사용 문제들이 모여 있습니다. 예를 들어, 0이 입력될 때까지 무한히 입력 받아 출력하기, 특정 값이 나오면 중단하기 등 break, continue를 익히기 좋습니다.
- 프로그래머스 Lv0: 반복문 활용 문제 – “문자 반복 출력하기” (문자를 n번 반복), “피자 나눠 먹기” (조건 만족까지 몇 판 필요한지 계산) 등 간단하지만 반복/누적이 필요한 문제들로 연습해보세요. 이런 문제들은 한두 줄의 수식으로도 풀리지만, 반복으로 풀며 로직을 확인하는 과정이 중요합니다.
2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 1 PCCE 시험 개요와 LV3 등급 분석
2025.05.22 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 2: 변수, 자료형, 연산자 – Python 기본 문법 ①
2025.05.23 - [프로그래밍] - [PCCE] LV3 파이썬 완전정복: Part 3 조건문 – 흐름 제어 기초
'프로그래밍' 카테고리의 다른 글
[PCCE] LV3 파이썬 완전정복: Part 6 함수 정의와 활용, 표준 라이브러리 (math, random) (0) | 2025.05.25 |
---|---|
[PCCE] LV3 파이썬 완전정복: Part 5 리스트와 2차원 리스트 – 자료구조 입문 (0) | 2025.05.24 |
[PCCE] LV3 파이썬 완전정복: Part 3 조건문 – 흐름 제어 기초 (0) | 2025.05.23 |
[PCCE] LV3 파이썬 완전정복: Part 2: 변수, 자료형, 연산자 – Python 기본 문법 ① (0) | 2025.05.22 |
[PCCE] LV3 파이썬 완전정복: Part 1 PCCE 시험 개요와 LV3 등급 분석 (0) | 2025.05.22 |