정보처리기사 실기 Python 반복문·리스트 출력 결과 추적법 | 표로 푸는 예제
2026. 10. 5. 07:11ㆍWORK/커리어

이 글은 LIFE ARCHITECTURE의 WORK 카테고리 ‘일하며 공부하는 구조’ 기록입니다. 퇴근 후 짧은 시간에 자격증 공부를 이어가려면 의지보다 ‘한 번에 끝낼 수 있는 작은 단위’로 공부를 쪼개는 구조가 필요합니다. 이번에는 Python 반복문과 리스트를 예로, 인덱스마다 값이 바뀌는 과정과 두 출력 결과를 한 줄씩 추적하는 방법을 정리했습니다.
출근 준비를 마치고 짧은 코드를 한 번 읽는다. 숫자 세 개뿐인데 반복문이 지나간 뒤에는 원래 리스트와 새 리스트가 모두 달라져 있다. 머릿속으로 한꺼번에 계산하면 두 결과를 섞기 쉽다. 이럴 때는 반복 횟수, 읽는 위치, 바뀐 값을 한 행씩 기록하면 된다.
Python 리스트 출력 문제는 반복문의 현재 인덱스 → 그 자리의 값 변경 → 조건 판단 → 새 리스트에 추가 순서로 추적한다. 마지막 print를 먼저 예상하기보다 각 반복 직후의 상태를 적는 편이 정확하다. 이 글의 코드는 설명을 위해 만든 독립적인 연습 예제이며 Python에서 실행해 출력값을 확인했다.
1. 먼저 반복 변수가 값인지 위치인지 구별한다
for x in values에서 x는 리스트에서 차례로 꺼낸 값이다. 반면 for i in range(len(values))에서 i는 0부터 시작하는 인덱스다. values[i]처럼 대괄호 안에 쓰일 때 그 위치의 원소를 읽는다. 이름이 i인 것만 보고 위치라고 판단할 수는 없다. for i in values라면 그 변수는 여전히 원소의 값이다.
Python 공식 문서는 for가 시퀀스의 항목을 순서대로 순회한다고 설명하고, range(5)가 0부터 4까지 만든다는 예를 제시한다. 따라서 range(3)은 0, 1, 2를 순서대로 주고 끝값 3은 포함하지 않는다. 길이가 3인 리스트에서 values[0], values[1], values[2]를 가리키는 셈이다.
2. 한 줄을 실행할 때마다 리스트 상태를 갱신한다
다음 코드를 먼저 읽고 표의 빈칸을 스스로 채워 보자.
values = [2, 4, 6]
picked = []
for i in range(len(values)):
values[i] += i
if values[i] % 2 == 0:
picked.append(values[i])
else:
picked.append(i)
print(values)
print(picked)
values[i] += i는 현재 원소를 읽어 i를 더한 뒤 같은 위치에 다시 저장한다. 조건문은 변경 전 숫자가 아니라 변경 후 values[i]를 검사한다. append는 리스트 끝에 항목 하나를 더한다. 두 print는 반복이 모두 끝난 뒤에 실행된다.
반복 i |
바꾸기 전 values[i] |
바꾼 뒤 값 | 짝수인가 | picked에 추가 |
반복 직후 values |
|---|---|---|---|---|---|
| 0 | 2 | 2 | 참 | 2 | [2, 4, 6] |
| 1 | 4 | 5 | 거짓 | 인덱스 1 | [2, 5, 6] |
| 2 | 6 | 8 | 참 | 8 | [2, 5, 8] |
따라서 첫 출력은 [2, 5, 8], 둘째 출력은 [2, 1, 8]이다. 가운데 원소가 5로 바뀌었을 때 picked에는 5가 아니라 i의 값 1이 들어간다. 조건의 참·거짓과 추가할 대상을 나누어 적어야 하는 이유다.
3. 코드의 순서를 바꾸면 같은 숫자도 다른 결과가 된다
위 코드에서 if를 values[i] += i보다 먼저 놓으면 어떻게 될까. i=1일 때 조건은 변경 전 4를 검사한다. 짝수이므로 picked에 4가 들어간 뒤 원소가 5로 바뀐다. 원래 예제의 둘째 출력과 달라진다. 코드가 같은 줄들을 포함해도 실행 순서가 다르면 답이 달라지는 것이다.
손으로 읽을 때는 현재 줄 왼쪽에 작은 화살표를 그려도 좋다. 원소를 수정하는 줄을 지났는지 표시하고 조건문에서는 가장 최근 상태만 쓴다. 여러 줄을 머릿속에서 동시에 유지할 필요가 없다. 세 번 반복한다면 표도 세 행이면 충분하다.
4. append가 돌려주는 값과 리스트의 변화를 분리한다
picked.append(8)은 리스트 끝에 8을 붙인다. 반환값으로 새 리스트를 만들어 주는 표현은 아니다. 다음 코드는 다른 결과를 낸다.
items = [1, 2]
answer = items.append(3)
print(items)
print(answer)
출력은 차례로 [1, 2, 3]과 None이다. items라는 기존 리스트가 바뀌었지만 answer에는 append의 반환값이 들어간다. append를 호출한 뒤에는 “어느 리스트가 변했나”와 “대입된 변수에 무엇이 들어갔나”를 별도로 확인한다. 이는 앞의 예제에서 picked.append(...)가 실행되어도 values의 요소 변경과는 별개라는 점을 다시 보여 준다.
5. 같은 리스트를 가리키는 이름 둘은 함께 바뀐다
변수 이름이 둘이라고 리스트도 둘인 것은 아니다.
first = [3, 5]
same = first
copy = first[:]
first.append(7)
print(same)
print(copy)
same = first는 같은 리스트를 가리키는 이름을 하나 더 붙인 것이다. first.append(7) 뒤 same의 출력은 [3, 5, 7]이다. first[:]는 이 예제처럼 숫자 원소로 된 리스트의 얕은 복사본을 만들므로 copy는 [3, 5]로 남는다. 다만 원소 안에 다시 변경 가능한 리스트가 있다면 얕은 복사만으로 안쪽 객체까지 독립적으로 복제되지는 않는다. 여기서는 숫자만 사용해 그 차이를 단순하게 확인한다.
출력 추적 표를 그릴 때 변수 이름마다 무조건 새 리스트를 그리지 말자. 대입문 오른쪽이 기존 리스트 자체인지, 슬라이스로 만든 새 리스트인지 먼저 보아야 한다.
6. 반복 중 원본을 바꾸는 코드는 먼저 순회 대상을 확인한다
앞의 첫 연습은 range(len(values))로 시작할 때 반복할 인덱스 0, 1, 2를 정했다. 각 자리의 숫자는 바꾸었지만 리스트 길이는 그대로였다. 반면 리스트를 직접 순회하면서 append로 길이까지 늘리면 나중에 읽을 원소가 생겨 풀이가 훨씬 복잡해질 수 있다. Python 공식 문서도 순회 중인 컬렉션을 수정할 때는 복사본을 순회하거나 새 컬렉션을 만들도록 안내한다.
문제에서 길이가 바뀐다면 “반복을 시작할 때 어떤 객체를 순회하는가”부터 적는다. for x in values[:]는 시작 시 만든 복사본을 읽고 원본 values를 수정할 수 있다. 단순한 출력 문제라면 원본을 건드리지 않는 별도 결과 리스트를 쓰는 편이 풀이도 설명도 명확하다.
7. 짧은 연습은 출력 두 줄을 따로 써 본다
아래 문제도 이 글을 위해 만든 연습 예제다. 정답을 보기 전에 i, data[i], saved를 두 행짜리 표로 적는다.
data = [3, 4]
saved = []
for i in range(2):
data[i] = data[i] + i + 1
saved.append(data[i] * i)
print(data)
print(saved)
i=0에서는 첫 원소가 3에서 4가 되고 saved에 4 * 0, 즉 0을 넣는다. i=1에서는 둘째 원소가 4에서 6이 되고 saved에 6 * 1, 즉 6을 넣는다. 출력은 [4, 6]과 [0, 6]이다. 0이 보인다고 반복문이 실행되지 않았다고 생각하면 안 된다. 반복은 실행됐고 곱셈의 한쪽 값이 0이었다.
결과 표를 읽는 감각은 앞선 SQL SELECT·WHERE·ORDER BY 결과 읽기 글에서도 이어진다. SQL에서는 남길 행과 출력 열을 나누고, Python에서는 현재 원소와 출력할 리스트를 나눈다. 둘 다 최종 결과를 서두르지 않는 연습이다.
8. 마지막 확인은 세 질문이면 충분하다
풀이를 마친 뒤에는 다음 항목을 순서대로 확인한다.
자주 묻는 질문 — range(1, 4)는 몇 번 반복할까? 1, 2, 3을 내므로 세 번이다. 끝값 4는 포함하지 않는다.
자주 묻는 질문 — for x in items에서 x를 바꾸면 items도 바뀔까? items가 숫자 리스트이고 x += 1처럼 변수에 새 숫자를 대입한다면 리스트 원소는 그대로다. 원소 자체를 수정하려면 items[i] = ...처럼 위치에 다시 대입해야 한다.
자주 묻는 질문 — 두 변수의 출력이 함께 바뀌면 오류일까? 같은 리스트를 가리키는 두 이름이라면 예상할 수 있는 결과다. 대입과 복사를 구별하면 이유를 설명할 수 있다.
오늘은 짧은 코드 한 개만 골라 반복마다 리스트 두 개의 상태를 적어 보자. 맞힌 결과보다 중요한 것은 어느 줄에서 값이 달라졌는지를 자기 말로 설명하는 일이다. 한 줄씩 읽는 습관이 다음 문제를 풀 자리를 만든다.
자료 확인일: 2026년 10월 5일. 시험 종목과 실기 형태는 Q-Net 정보처리기사 안내, 반복문과 range는 Python 공식 제어 흐름 문서, 리스트 메서드와 복사는 Python 공식 자료 구조 문서를 확인했다. 예제 코드와 출력 표는 별도로 실행해 검산했다.
'WORK > 커리어' 카테고리의 다른 글
| 정보처리기사 실기 정규화와 함수 종속 | 복합키·2정규형·3정규형 예제 (0) | 2026.10.12 |
|---|---|
| 정보처리기사 실기 C 배열·포인터: 값 변화와 출력 결과 추적하는 법 (0) | 2026.10.07 |
| 정보처리기사 실기 SQL JOIN과 NULL을 예제 표로 이해하기 (0) | 2026.10.04 |
| 정보처리기사 실기 SQL SELECT·WHERE·ORDER BY 결과 읽기 (0) | 2026.09.30 |
| 일의 방향이 불안할 때 | 나만의 커리어 기준을 찾는 방법 (0) | 2026.09.26 |