정보처리기사 실기의 Python 코딩 문제는 C·Java보다 코드가 짧지만, 슬라이싱과 자료구조의 세밀한 규칙에서 갈린다. 문법이 간결한 만큼 한 글자 차이로 출력이 바뀌므로, 규칙을 정확히 알아야 한다.
슬라이싱 — a[start:stop:step]
리스트 슬라이싱은 a[시작:끝:간격] 세 자리로 읽는다. 끝 인덱스는 포함하지 않는다. 생략하면 시작은 0, 끝은 길이, 간격은 1이 기본이다.
a = [1, 2, 3, 4, 5]
print(a[1:4]) # ① [2, 3, 4]
print(a[:3]) # ② [1, 2, 3]
print(a[2:]) # ③ [3, 4, 5]
print(a[::2]) # ④ [1, 3, 5]
print(a[::-1]) # ⑤ [5, 4, 3, 2, 1]
print(a[-2:]) # ⑥ [4, 5]
- ① 1번부터 4번 앞까지 → 인덱스 1,2,3 →
[2, 3, 4]. - ② 처음부터 3번 앞까지 →
[1, 2, 3]. - ③ 2번부터 끝까지 →
[3, 4, 5]. - ④ 간격 2로 건너뛰기 →
[1, 3, 5]. - ⑤ 간격 -1은 역순 →
[5, 4, 3, 2, 1]. 문자열 뒤집기 단골이다. - ⑥ 음수 인덱스는 뒤에서 센다. -2는 뒤에서 둘째 →
[4, 5].
핵심은 끝 인덱스 미포함과 음수 인덱스, 그리고 step이 음수면 뒤에서 앞으로 간다는 것.
얕은 복사 함정 — 리스트는 참조다
a = [1, 2, 3]
b = a # ① 같은 객체를 가리킴
b.append(4)
print(a) # [1, 2, 3, 4]
c = a[:] # ② 슬라이싱으로 복사
c.append(5)
print(a) # [1, 2, 3, 4] (c만 바뀜)
- ①
b = a는 리스트를 복사하지 않는다. 같은 객체를 두 이름이 가리키므로 b를 바꾸면 a도 바뀐다. - ②
a[:]는 새 리스트를 만든다. 그래서 c를 바꿔도 a는 그대로다.
“왜 a까지 바뀌나”를 묻는 문제의 답은 항상 리스트가 참조로 대입되기 때문이다.
딕셔너리와 반복
d = {'a': 1, 'b': 2, 'c': 3}
print(d['b']) # 2
print('a' in d) # True (키를 검사)
total = 0
for v in d.values():
total += v
print(total) # 6
in은 키를 검사한다는 점, .values()·.keys()·.items()로 무엇을 순회하는지가 출제 포인트다.
컴프리헨션과 range
nums = [i * i for i in range(1, 5)]
print(nums) # [1, 4, 9, 16]
print(list(range(0, 10, 3))) # [0, 3, 6, 9]
range(1, 5)는 1,2,3,4 (끝 미포함). 슬라이싱과 같은 규칙이다. 제곱을 담으면 [1, 4, 9, 16]. range(0, 10, 3)은 3씩 건너뛰어 0,3,6,9.
시험에서 실수하는 지점
- 끝 인덱스 미포함 —
a[1:4]는 4번을 안 넣는다. range도 동일. - 정수 나눗셈 —
7 / 2는 3.5(실수),7 // 2는 3(몫),7 % 2는 1(나머지).//와/를 헷갈리면 틀린다. - 문자열도 슬라이싱된다 —
"PYTHON"[1:4]는"YTH". 리스트와 규칙이 같다. - 얕은 복사 — 대입은 복사가 아니다. 복사하려면
a[:]나a.copy().
Python 문제는 코드가 짧아 방심하기 쉽지만, “끝은 포함 안 함”과 “대입은 참조 공유”라는 두 규칙을 놓치면 출력이 어긋난다. 슬라이싱은 세 자리를 또박또박 읽고, 리스트를 다룰 땐 같은 객체인지 새 객체인지부터 따지면 된다.
이 글에 대한 의견은 아래 댓글로 남겨주세요 (GitHub 계정 필요). 로그인 없이 남기고 싶다면