Python — 슬라이싱 · 딕셔너리 · 집합 · 클래스 · 복사 E07

11회 전부에 나온 언어다. 첨자는 0부터, 끝은 빠지고, 음수는 뒤에서, 집합은 중복이 없고, 대입은 같은 것을 가리킨다

왜 이 장을 하나
Python 은 코드가 짧아 쉬워 보이지만 슬라이스의 끝이 빠진다는 것, 집합은 중복을 지우고 순서가 없다는 것, 얕은 복사는 안쪽을 공유한다는 것에서 매번 갈린다. 세 규칙과 문자열 · 딕셔너리 메서드 한 벌로 15문항이 풀린다.
다루는 것슬라이싱 · 문자열 메서드 · 리스트 · 딕셔너리 · 집합 · 컴프리헨션 · 클래스 · 복사
문항기출 15 · 예상 4 · 훈련 30
끝나면슬라이스를 보고 첨자 줄을 그려 읽는다

01왜 이 장인가

왜 이걸 하나 — 프로그래밍 91문항 중 Python 이 15문항이고 11회 전부에 나왔다. 2026년 1회에는 3문항이었다.

11회분 220문항 중 이 장의 기출은 15문항이다. 빠진 회차가 없고, 2026년 1회 3문항 · 2026년 2회 2문항으로 최근에 늘었다. 훈련 Python 30문항 전부가 이 장에 붙어 프로그래밍 여섯 장 중 훈련이 가장 많다.

몇 문항무엇을 적나보기
문자열 슬라이싱 · 메서드6슬라이스 조합 · count · split · 역순 · 글자 골라내기2023-2회 5번 · 2023-3회 16번 · 2024-1회 12번 · 2024-2회 8번 · 2026-1회 14번 · 2026-2회 5번
리스트 · 슬라이스 스텝3교환 후 짝수 · 홀수 첨자 합, 역순 스텝, 얕은 복사2024-3회 2번 · 2026-1회 10번 · 12번
딕셔너리 · 집합4집합 연산 결과 · 컴프리헨션 · 순회 · 합과 길이2023-1회 15번 · 2025-2회 17번 · 2025-3회 20번 · 2026-2회 13번
타입 · 클래스 · 재귀2type 비교 · 트리 홀수 레벨 합2024-3회 14번 · 2025-1회 17번

→ 슬라이스나 첨자로 글자를 고르는 문항이 15개 중 9개다. s[a:b] 는 a 부터 b 앞까지, s[::-2] 는 뒤에서 두 칸씩 — 첨자 줄을 그려 세는 습관 하나가 절반을 정한다.

E01 진단의 5번(_THIISING)과 13번(CNNLRPYT)이 이 장이고 둘 다 맞았다면 슬라이싱과 딕셔너리 순회는 됐다는 뜻이다. 남은 것은 집합의 중복 제거와 얕은 복사(2026년 1회 12번)처럼 실무에서 잘 안 밟는 함정이다.

문항 수는 이 노트의 문제 데이터에서 ch=E07 인 것을 센 값이다(2026-09-14). 기출 코드는 grandlife.co.kr 복원에서 옮겼고, 15문항 전부 Python 3.12 로 실행해 정답을 확인했다. 입력이 필요한 2026-1회 14번은 HumanDev 를 넣어 실행했다.

02한눈에

왜 이걸 하나 — 시험 전날 규칙 9개를 다시 본다.

슬라이스s[a:b] 는 첨자 a 부터 b 까지. s[a:] 끝까지, s[:b] 처음부터. s[::k] 는 k 칸씩, s[::-1] 역순, s[::-2] 뒤에서 두 칸씩. 음수 첨자 −1 은 마지막.
문자열 메서드len · count(x) · split()(공백 · 구분자로 나눠 리스트) · join · upper · lower · strip · replace · find. 문자열은 불변이라 s += "x" 는 새 문자열.
리스트append · pop()(마지막) · pop(0) · insert · sort()(제자리) · sorted()(새 리스트) · reversed. a, b = b, a 로 교환. range(a, b, k) 도 b 앞까지.
딕셔너리d[k] 조회 · 대입, d.get(k, 기본), d.keys() · values() · items(), for k, v in d.items(). 순회는 넣은 순서(3.7+). max(d, key=d.get) 은 값이 최대인 키.
집합중복 없음 · 순서 없음. add · remove · update. & 교집합 · | 합집합 · - 차집합. set(리스트) 로 중복 제거. 출력 순서는 묻지 않는 것이 보통.
컴프리헨션[x * 2 for x in a if x % 2]. 딕셔너리 {k: v for …}, 집합 {x for …}. 조건이 뒤에 있으면 거름, 앞에 있으면 삼항.
복사b = a 는 같은 객체. b = a[:] · list(a) 는 얕은 복사 — 겉은 새 리스트, 안의 리스트는 공유. b[i] += … 는 안쪽 리스트를 제자리에서 늘린다.
타입 · 클래스type(100) 은 int, type("") 은 str. bool 은 int 의 하위. 클래스는 __init__(self, …), 속성은 self.x, 클래스 변수는 모든 인스턴스가 공유. 상속 class B(A), super().f().
출력print(a, b) 는 공백으로 이어 붙임, end='' 면 줄바꿈 없음, sep 으로 구분자. 리스트를 찍으면 [1, 2] 꼴 그대로, 튜플은 (3, 6).

03밑바닥

왜 이걸 하나 — 규칙 9개는 첨자 줄 하나와 쪽지 그림 하나로 전부 그려진다.

3-1. 슬라이스는 「a 부터 b 앞까지」다

문자열 위에 첨자 줄을 0 1 2 … 로 적고, s[a:b] 는 a 에서 시작해 b 바로 앞에서 멈춘다. 2026년 2회 5번의 str[:4] 는 0~3 → _THI, str[6:8] 은 6~7 → IS, str[18:] 은 18부터 끝 → ING, 붙여서 _THIISING. 2023년 2회 5번(engneing)도 같은 규칙으로 조각 셋을 잇는다.

스텝이 붙으면 건너뛴다. lst[::-2] 는 뒤에서부터 두 칸씩이라 range(10) 에서 9 · 7 · 5 · 3 · 1 이고, 각각 뒤에 A 를 붙여 9A7A5A3A1A(2026년 1회 10번). 음수 스텝은 시작이 끝이고 끝이 시작이라는 것만 기억하면 된다.

글자 하나를 고르는 것은 첨자다. 2024년 1회 12번은 단어마다 word[1](둘째 글자)을 이어 붙여 Seynaau, 2026년 2회 13번은 키의 마지막 글자 key[-1] 과 값의 첫 글자 location[0] 을 번갈아 붙여 CNNLRPYT 다. −1 이 마지막이라는 것과 딕셔너리는 넣은 순서로 돈다는 것이 그 둘의 전부다.

3-2. 문자열 메서드는 새 값을 돌려주고 원본은 안 바뀐다

문자열은 불변이라 upper() · replace() · split() 은 새 값을 돌려주고 원본은 그대로다. 2024년 2회 8번은 text.count("3") 이 3, text.count("a") 이 3 이라 슬라이스 조각과 섞어 ab3ca3. 2026년 1회 14번은 입력 HumanDev 를 split() 하고 join 으로 붙인 뒤 [::-1] 로 뒤집고(veDnamuH) o · n · g 를 빼 veDamuH 다.

공백으로 두 값을 나눠 받는 관용구 a, b = input().split() 의 빈칸은 split 이다(2023년 3회 16번). 문자열 메서드는 「무엇을 돌려주나」(문자열인가 리스트인가 정수인가)를 알면 다음 줄이 읽힌다 — split 은 리스트, count 는 정수, join 은 문자열.

3-3. 집합은 중복을 지우고, 딕셔너리는 키로 찾는다

집합에 같은 것을 두 번 넣으면 하나만 남는다. 2023년 1회 15번은 add('중국') 이 이미 있어 아무 일도 없고, remove('일본') 으로 하나 빠진 뒤 update({'홍콩', '한국', '태국'}) 에서 한국이 겹쳐 최종 원소가 한국 · 중국 · 베트남 · 홍콩 · 태국 다섯이다. 문제가 「순서는 고려하지 않는다」고 한 것은 집합에 순서가 없기 때문이다.

2025년 2회 17번은 딕셔너리 컴프리헨션으로 {1: 2, 2: 4, 3: 6} 을 만들고 값의 집합 {2, 4, 6} 을 저장해 둔 뒤, doubled[2] = 7 로 값을 바꾸고 saved 에 99 를 넣는다. 교집합은 {2, 6} 이라 길이 2 — saved 는 만들 때의 값을 복사한 것이라 나중 변경이 안 따라오고, numbers 를 바꿔도 이미 만든 doubled 와는 무관하다는 것이 함정이다.

딕셔너리 순회는 items() 로 키와 값을 함께 꺼낸다. 2025년 3회 20번은 enumerate 로 안쪽 리스트마다 (합, 길이) 튜플을 만들어 {0: (15, 5), 1: (10, 3), 2: (18, 5), 3: (9, 2)} 를 찍고, 빈칸 여덟 개가 그 숫자들이다. 튜플 안의 순서(합이 먼저)를 코드에서 확인한다.

3-4. 대입은 같은 것을 가리키고, [:] 는 겉만 새것이다

b = a 는 같은 리스트를 두 이름으로 부르는 것이라 한쪽을 바꾸면 다른 쪽도 바뀐다. b = a[:] 는 새 리스트를 만들지만 안에 든 리스트 객체는 그대로 공유한다(얕은 복사). 2026년 1회 12번의 b = m[:]b[i + 1] += b[i] 는 안쪽 리스트를 제자리에서 늘리므로 m 의 안쪽도 함께 커져 길이 합이 1 + 2 + 3 + 4 = 10 이다.

리스트 교환 values[i], values[-i - 1] = values[-i - 1], values[i] 는 임시 변수 없이 자리를 바꾼다. 2024년 3회 2번은 앞뒤를 바꿔 6 5 4 3 2 1 을 만든 뒤 짝수 첨자 합(6 + 4 + 2)에서 홀수 첨자 합(5 + 3 + 1)을 빼 3 이다. 매 교환 뒤의 리스트를 다시 적는 것이 이 문제의 절차다.

타입 검사(2024년 3회 14번)는 type(value) == type(100) 이 int 인지, type("") 이 str 인지를 본다. "100.0" 은 문자열이라 길이 5, 100.0 은 float 이라 20, 튜플도 20 → 45. 클래스 문제(2025년 1회 17번)는 트리를 리스트로 만들고 홀수 레벨(1 · 3 …)의 값만 재귀로 더해 13 이다.

통과 기준은 넷이다. 첫째, 첨자 줄을 그려 s[a:b] · s[::-k] · s[-1] 을 30초 안에 읽는다. 둘째, 문자열 메서드가 무엇을 돌려주는지(문자열 · 리스트 · 정수) 말한다. 셋째, 집합의 중복 제거 · 무순서와 딕셔너리 순회 순서를 안다. 넷째, b = a · b = a[:] · 안쪽 공유의 차이를 그림으로 그린다. 기출 15문항이 이 넷 안에 있다.
s[2:5] 는 첨자 2 부터 5 까지 네 글자다.5 앞에서 멈춘다 — 2 · 3 · 4 세 글자. range(a, b) 도 같다. 2026년 2회 5번의 str[6:8] 이 두 글자 IS 인 이유다.
b = a[:] 로 복사했으니 b 를 바꿔도 a 는 안 바뀐다.겉 리스트만 새것이다. 안에 리스트가 들어 있으면 그 리스트는 공유라 b[i] += … 가 a 의 안쪽도 바꾼다. 2026년 1회 12번의 10 이 그 결과다. 완전히 떼려면 copy.deepcopy.

04기출

왜 이걸 하나첨자 줄과 중간 결과를 적으며 푸는 연습이다. 암산이 Python 오답의 첫째 원인이다.

슬라이스가 보이면 문자열 위에 첨자를 적고, 메서드가 이어지면 줄마다 중간 값을 적는다. 집합 · 딕셔너리는 연산마다 현재 내용을 다시 적는다.

2023-1회 · 15번Python

다음 Python 프로그램의 실행 결과에 남는 집합 원소를 쓰시오. 원소의 출력 순서는 고려하지 않는다.

countries = {'한국', '중국', '일본'} countries.add('베트남') countries.add('중국') countries.remove('일본') countries.update({'홍콩', '한국', '태국'}) print(countries)
정답한국, 중국, 베트남, 홍콩, 태국(순서 무관)
세트(set)는 "중복을 자동으로 거르는 주머니". add('중국')은 이미 있어서 무시, remove('일본')로 제거, update는 여러 개 한꺼번에 추가(중복 '한국'은 무시). 최종 5개 원소. 확인 방법: 집합 원소 비교(순서 무관). (Python 3.12) 그랜드라이프 가답안 표기는 「한국, 중국, 베트남, 홍콩, 태국(순서 무관)」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-2회 · 5번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

text = "engineer information processing" first = text[:3] second = text[4:6] third = text[28:] print(first + second + third)
정답engneing
b="eng"(0~2), c="ne"(4~5, 끝 인덱스 미포함!), d="ing"(29번부터 끝까지). 슬라이싱은 "끝 번호 직전까지"가 철칙. 공백도 한 칸을 차지하므로 인덱스를 셀 때 반드시 포함하세요. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (Python 3.12) 그랜드라이프 가답안 표기는 「engneing」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-3회 · 16번Python

공백으로 구분해 입력한 두 값을 각각 저장하려고 한다. Python 코드의 ①에 들어갈 메서드 이름을 쓰시오.

first, second = input().( ① )() first = int(first) second = int(second) print(first, second)
정답split
split = "가위로 자르기". 반대로 이어붙이기는 ','.join(리스트). split/join 짝은 Python 최다 빈출 메서드. 확인 방법: split 메서드. (Python 3.12) 그랜드라이프 가답안 표기는 「split」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-1회 · 12번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

words = ["Seoul", "Kyeonggi", "Incheon", "Daejun", "Daegu", "Pusan"] result = "S" for word in words: result += word[1] print(result)
정답Seynaau
리스트의 각 문자열에서 지정 위치 글자만 뽑아 이어 붙이는 유형. for + 인덱싱 + 문자열 연결(+=)의 조합 — 각 단어 아래에 인덱스 번호를 적어가며 추적하세요. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「Seynaau」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-2회 · 8번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

text = "ab3ca3a3" print(text[:2] + str(text.count("3")) + text[3:5] + str(text.count("a")))
정답ab3ca3
문자열 순회 + 슬라이스 비교(s[i:i+2] == "ab") 패턴. count() 메서드와 동일한 원리를 수동 구현한 유형. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「ab3ca3」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-3회 · 2번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

def reverse(values): for i in range(len(values) // 2): values[i], values[-i - 1] = values[-i - 1], values[i] values = [1, 2, 3, 4, 5, 6] reverse(values) print(sum(values[::2]) - sum(values[1::2]))
정답3
Python 다중 할당 a[0], a[1] = a[1], a[0]은 임시 변수 없이 교환됩니다. 역순 [::-1]과 조합되면 각 단계 후의 리스트를 반드시 다시 적으세요. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「3」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-3회 · 14번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

def value_of(value): if type(value) == type(100): return 100 elif type(value) == type(""): return len(value) return 20 a = "100.0" b = 100.0 c = (100, 200) print(value_of(a) + value_of(b) + value_of(c))
정답45
isinstance(x, int)는 "x가 정수 타입인가" 검사. 리스트 안에 섞인 str/int/float를 타입별로 골라 처리하는 유형 — bool이 int의 하위 타입이라는 함정도 알아두면 좋습니다. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「45」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-1회 · 17번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

class Node: def __init__(self, value): self.value = value self.children = [] def build(values): nodes = [Node(value) for value in values] for index in range(1, len(nodes)): nodes[(index - 1) // 2].children.append(nodes[index]) return nodes[0] def odd_level_sum(node, level=0): own = node.value if level % 2 == 1 else 0 return own + sum(odd_level_sum(child, level + 1) for child in node.children) root = build([3, 5, 8, 12, 15, 18, 21]) print(odd_level_sum(root))
정답13
순회 3형제: 전위(루트→왼→오), 중위(왼→루트→오), 후위(왼→오→루트). "루트를 언제 방문하나"만 다릅니다. 2025년 신유형 — 자료구조 기본기가 실기에 들어왔습니다. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「13」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-2회 · 17번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

numbers = [1, 2, 3] doubled = {number: number * 2 for number in numbers} saved = set(doubled.values()) numbers[0] = 99 doubled[2] = 7 saved.add(99) print(len(saved & set(doubled.values())))
정답2
딕셔너리 = 이름표 달린 사물함, 세트 = 중복 제거 주머니. 교집합(&), 합집합(|), 차집합(−)과 len()의 조합 문제가 반복 출제됩니다. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「2」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-3회 · 20번Python

다음 Python 프로그램의 출력에서 빈칸 ①부터 ⑧에 들어갈 값을 순서대로 쓰시오.

data = [ [3, 5, 2, 4, 1], [4, 5, 1], [4, 4, 1, 5, 4], [4, 5] ] result = {} for index, values in enumerate(data): result[index] = (sum(values), len(values)) print(result)

[출력] {0: (①, ②), 1: (③, ④), 2: (⑤, ⑥), 3: (⑦, ⑧)}

정답① 15 ② 5 ③ 10 ④ 3 ⑤ 18 ⑥ 5 ⑦ 9 ⑧ 2
딕셔너리 필수 도구: d[key] 조회/수정, d.get(key, 기본값), len(d), sum(d.values()), max(d, key=d.get). 출력 개수가 많은 문제는 하나씩 번호를 붙여 차분히. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「① 15 ② 5 ③ 10 ④ 3 ⑤ 18 ⑥ 5 ⑦ 9 ⑧ 2」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-1회 · 10번Python

다음 Python 프로그램을 실행했을 때 출력되는 값을 쓰시오.

lst = list(range(10)) for c in lst[::-2]: print(c, end='A') print()
정답9A7A5A3A1A
[::-2] = "뒤에서부터 2칸씩 건너뛰며" → 9,7,5,3,1. end='A'는 줄바꿈 대신 A를 붙임 — 마지막에도 A가 붙는다는 것까지 정확히! 복원된 코드를 실행해 위 출력을 그대로 얻었다. (Python 3.12) 그랜드라이프 가답안 표기는 「9A7A5A3A1A」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-1회 · 12번Python

다음 Python 프로그램을 실행했을 때 출력되는 값을 쓰시오.

def f(a): m = [[x] for x in a] b = m[:] for i in range(len(b) - 1): b[i + 1] += b[i] return sum(len(x) for x in m) print(f([1, 2, 3, 4]))
정답10
✔ 재검증 완료: 흥달쌤 시트·정처기감자 일치로 확정 (얕은 복사 시 내부 리스트는 참조 공유 → 10). b = a[:]는 새 리스트 복사(얕은 복사) — 겉 리스트는 분리되지만 내부의 리스트 객체는 여전히 공유된다는 것까지가 이 문제의 핵심. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「10」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-1회 · 14번Python

다음 Python 프로그램에 HumanDev를 입력했을 때 출력되는 값을 쓰시오.

i = input() x = [] for word in i.split(): x.append(word) y = ''.join(x) z = ''.join(c for c in y[::-1] if c not in 'ong') print(z)
정답veDamuH
역순([::-1]) → "veDnamuH" → n 제거 → "veDamuH". 문자열 문제는 각 단계의 중간 결과를 반드시 적으면서 진행 — 암산은 실수의 지름길. 복원된 코드를 Python 3.12 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「veDamuH」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2026-2회 · 5번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

str = "_THIS_IS_KIM_SPEAKING" a = str[:4] b = str[6:8] c = str[18:] ans = a + b + c print(ans)
정답_THIISING
인덱스는 0부터다. str[:4] 는 0~3 → _THI, str[6:8] 은 6~7 → IS, str[18:] 은 18번째부터 끝까지 → ING. 이어 붙이면 _THIISING. 파이썬 3.12 로 실행해 확인했다. 맨 앞 밑줄을 빠뜨리면 틀린다. 복원 출처는 grandlife.co.kr 2026-2회 복원 풀이(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·수치가 실제와 다를 수 있다.
2026-2회 · 13번Python

다음 Python 프로그램의 실행 결과를 쓰시오. 딕셔너리는 작성된 순서대로 순회한다고 가정한다.

class LocationDict: locations = { "NYC": "New York", "LON": "London", "PAR": "Paris", "TKY": "Tokyo" } obj = LocationDict() result = "" for key, location in obj.locations.items(): result += key[-1] + location[0] print(result, end="")
정답CNNLRPYT
key[-1] 은 키의 마지막 글자, location[0] 은 값의 첫 글자다. NYC/New York → CN, LON/London → NL, PAR/Paris → RP, TKY/Tokyo → YT. 이어 붙이면 CNNLRPYT. 파이썬 3.12 로 실행해 확인했다. end="" 라 줄바꿈도 없다. 복원 출처는 grandlife.co.kr 2026-2회 복원 풀이(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·수치가 실제와 다를 수 있다.
예상 1회 · 4번Python빈출 원리: 딕셔너리 + 정렬

다음 코드의 출력을 쓰시오.

d = {'a': 3, 'b': 1, 'c': 2} s = sorted(d, key=d.get) print(s[0], d[s[-1]])
정답b 3
sorted(d, key=d.get)은 값 기준으로 키를 정렬 → ['b','c','a'] (값 1,2,3 순). s[0]='b', s[-1]='a'(마지막), d['a']=3. print의 콤마는 공백 출력 — "b 3". 2025 3회 Q20 딕셔너리 유형의 심화판.
예상 1회 · 7번Python빈출 원리: 컴프리헨션 + 세트

다음 코드의 출력을 쓰시오.

a = [x for x in range(1, 10) if x % 3 == 0] b = set(a + [3, 9, 12]) print(len(a), len(b), sum(a))
정답3 4 18
a=[3,6,9] (1~9 중 3의 배수). b=set([3,6,9,3,9,12])={3,6,9,12} — 중복 자동 제거로 4개. sum(a)=18. 컴프리헨션은 2026 1회부터 본격 출제 — "for 앞이 담을 값, if가 거름망".
예상 2회 · 4번Python빈출 원리: 문자열 메서드 체인

다음 코드의 출력을 쓰시오.

s = "Hello World" print(s.upper().count('L'), s.split()[1][::-1].lower())
정답3 dlrow
체인은 왼쪽부터 한 단계씩: upper() → "HELLO WORLD"에서 'L'은 3개. split()[1] → "World" → [::-1] → "dlroW" → lower() → "dlrow". print의 콤마 = 공백 구분. 2025 1회 문자열 체인 유형의 재현.
예상 2회 · 7번Python빈출 원리: lambda + map

다음 코드의 출력을 쓰시오.

a = [1, 2, 3, 4, 5] b = list(map(lambda x: x * x, a)) print(b[2] + b[-1])
정답34
map = "컨베이어 벨트에 전원 통과" — 모든 원소를 제곱해 b=[1,4,9,16,25]. b[2]=9(0부터 셈), b[-1]=25(뒤에서 첫 번째) → 34. 람다는 2025 2회 Java에서 첫 출제 — Python 쪽도 대비 필수.

05틀리는 자리

왜 이걸 하나 — Python 은 첨자 하나 · 괄호 하나에서 깎인다.

자리새는 꼴적는 법기출
끝 첨자s[6:8] 을 세 글자로b 앞까지. 글자 수는 b − a2026-2회 5번 · 2023-2회 5번
음수 스텝[::-2] 를 앞에서부터 센다뒤에서 시작. 마지막 · 그 두 칸 앞 …2026-1회 10번
집합 출력중복을 남기거나 순서를 답으로중복은 지우고, 순서는 「무관」이면 아무 순서2023-1회 15번
저장 시점set(doubled.values()) 가 나중 변경을 따라간다고만들 때 값을 복사한 것. 뒤의 변경은 무관2025-2회 17번
얕은 복사[:] 를 완전 복사로안쪽 리스트는 공유2026-1회 12번
출력 꼴튜플 · 리스트의 괄호 · 쉼표 · 공백을 빼먹는다print 는 (15, 5) · [1, 2] 꼴 그대로. end='' 면 줄바꿈 없음2025-3회 20번 · 2026-2회 13번
글자 고르기word[1] 을 첫 글자로0 이 첫 글자, 1 이 둘째, −1 이 마지막2024-1회 12번 · 2026-2회 13번
입력input 값의 공백 · 대소문자를 바꾼다문제가 준 입력 그대로 넣고 따라간다2026-1회 14번

Python 답은 print 가 찍는 꼴 그대로다. 리스트면 대괄호와 쉼표 뒤 공백까지, 튜플이면 소괄호까지 답이다.

06훈련

왜 이걸 하나 — 규칙 9개를 짧은 코드 30개로 돌린다. 하루 5문항이면 6일치다.

훈련 30문항은 슬라이싱 3종부터 sort · append, 딕셔너리 · 집합 연산, strip · count · replace, range 스텝, 컴프리헨션, split · join, 기본값 매개변수, *args, 클래스와 상속, 지역 변수, 불변성, 참조 vs 복사, sorted key, enumerate · zip, 예외, bool 산술, max key, 중첩 리스트, pop · insert, get 기본값, lambda 정렬까지다. 정답은 전부 Python 3.12 로 실행해 확인했다.

훈련 Python · 1번Python슬라이싱 3종
s = "PROGRAMMING" print(s[3:7], s[-4:], s[::3])
정답GRAM MING PGMN
[3:7]은 3~6번(끝 미포함), [-4:]는 뒤 4글자, [::3]은 0,3,6,9번 글자(P,G,M,N).
훈련 Python · 2번Pythonsort + append
a = [5, 3, 8, 1] a.sort() a.append(4) print(a[2], a[-1], len(a))
정답5 4 5
정렬 [1,3,5,8] → append로 [1,3,5,8,4]. append는 정렬을 다시 하지 않음 — a[-1]=4가 함정.
훈련 Python · 3번Python딕셔너리 추가 + in
d = {'x': 1, 'y': 2} d['z'] = d['x'] + d['y'] print(d['z'], len(d), 'y' in d)
정답3 3 True
없는 키에 대입 = 추가. 'y' in d 존재 검사(True는 대문자 T!).
훈련 Python · 4번Python집합 연산 3종
a = {1, 2, 3, 4} b = {3, 4, 5} print(sorted(a & b), sorted(a | b), sorted(a - b))
정답[3, 4] [1, 2, 3, 4, 5] [1, 2]
&=교집합, |=합집합, -=차집합. sorted()는 리스트를 반환하므로 대괄호로 출력.
훈련 Python · 5번Pythonstrip / count / replace
s = " Hello Python " t = s.strip() print(t.count('o'), t.replace('o', '0'))
정답2 Hell0 Pyth0n
strip은 양끝 공백 제거, count('o')=2, replace는 모든 o를 0으로. 원본 s는 불변(문자열은 항상 새로 생성).
훈련 Python · 6번Pythonrange 스텝 + 루프 후 변수값
total = 0 for i in range(1, 10, 2): total += i print(total, i)
정답25 9
1+3+5+7+9=25. 루프 종료 후 i는 마지막 값 9를 유지(C의 for와 달리 탈출값 10이 아님!).
훈련 Python · 7번Pythonwhile + //= 누적 나눗셈
n = 27 c = 0 while n > 1: n //= 3 c += 1 print(c, n)
정답3 1
27→9→3→1, 3회. //는 몫만 취하는 정수 나눗셈(/는 실수를 반환 — 언어별 차이 주의).
훈련 Python · 8번Python조건부 컴프리헨션
a = [x * 2 if x % 2 else x for x in range(5)] print(a)
정답[0, 2, 2, 6, 4]
x%2가 참(=홀수)이면 ×2, 아니면 그대로: 0→0, 1→2, 2→2, 3→6, 4→4. if가 for 앞이면 값 선택, for 뒤면 필터 — 위치가 의미를 바꿉니다.
훈련 Python · 9번Pythonsplit + 역순 + join
s = "a:b:c" parts = s.split(':') print('-'.join(parts[::-1]))
정답c-b-a
쪼개고(['a','b','c']) 뒤집고(['c','b','a']) 새 구분자로 잇기. 2026 1회 Q14 "HumanDev"와 동일 패턴.
훈련 Python · 10번Python기본값 매개변수
def f(a, b=2): return a * b print(f(3), f(3, 4))
정답6 12
b를 안 주면 기본값 2. Java 오버로딩이 하던 일을 Python은 기본값 하나로 해결.
훈련 Python · 11번Python*args와 튜플 반환
def f(*a): return len(a), sum(a) print(f(1, 2, 3))
정답(3, 6)
여러 값 반환 = 튜플 → 괄호와 콤마 포함 "(3, 6)"이 정답. 3 6으로 쓰면 오답!
훈련 Python · 12번Python딕셔너리 순회 + 조건
d = {'a': 2, 'b': 3, 'c': 5} s = 0 k2 = '' for k in d: if d[k] % 2 == 1: s += d[k] k2 += k print(s, k2)
정답8 bc
홀수 값 3, 5의 합 8, 해당 키 'b'+'c'. for k in d를 순회(삽입 순서 유지).
훈련 Python · 13번Python클래스 기본 (self)
class P: def __init__(self, n): self.n = n def add(self, x): self.n += x return self.n p = P(5) print(p.add(3), p.n)
정답8 8
add가 self.n을 직접 바꾸므로(5+3=8) 반환값과 속성값이 모두 8. __init__=생성자, self=자기 자신.
훈련 Python · 14번Python상속 + super()
class A: def f(self): return 1 class B(A): def f(self): return super().f() + 1 print(B().f())
정답2
super().f()로 부모의 1을 받아 +1. Java의 super와 같은 개념 — 문법만 다름.
훈련 Python · 15번Python지역 변수 가리기
x = 10 def f(): x = 20 return x print(f(), x)
정답20 10
함수 안의 x는 새 지역 변수 — 바깥 x는 10 그대로. global 선언이 있었다면 둘 다 20. C-27과 같은 원리.
훈련 Python · 16번Python문자열 불변성
s = "abc" t = s s += "d" print(s, t)
정답abcd abc
문자열 += 는 새 문자열을 만들어 s만 갈아끼움 — t는 옛 "abc"를 계속 가리킴. 리스트였다면 둘 다 바뀜(P-17과 대조!).
훈련 Python · 17번Python리스트 참조 vs 복사
a = [1, 2] b = a b.append(3) c = a[:] c.append(4) print(a, c)
정답[1, 2, 3] [1, 2, 3, 4]
b=a는 같은 리스트 공유(append가 a에 반영), a[:]는 새 복사본. 2026 1회 Q12의 핵심 원리 그대로.
훈련 Python · 18번Pythonsorted의 key
words = ["banana", "kiwi", "apple"] print(sorted(words, key=len)[0], sorted(words)[0])
정답kiwi apple
key=len이면 길이순(kiwi가 4로 최단), key 없으면 사전순(apple). key가 정렬 기준을 통째로 바꿈.
훈련 Python · 19번Pythonenumerate + 문자열 곱
r = '' for i, ch in enumerate("abc"): r += ch * i print(r)
정답bcc
(0,'a')→''(×0), (1,'b')→'b', (2,'c')→'cc'. enumerate는 (번호, 값) 쌍 — 번호가 0부터.
훈련 Python · 20번Pythonzip의 길이 맞춤
a = [1, 2, 3] b = ['x', 'y'] print(list(zip(a, b)))
정답[(1, 'x'), (2, 'y')]
zip은 짧은 쪽에 맞춰 짝을 만듦(3은 짝이 없어 버려짐). 튜플의 괄호·따옴표까지 정확히!
훈련 Python · 21번Python예외 처리 흐름
try: print(10 // 0) except ZeroDivisionError: print("E", end='') finally: print("F")
정답EF
0 나눗셈 → except "E"(end=''로 줄바꿈 없음) → finally "F" → 한 줄로 EF. try-except-finally는 Java와 동일 구조.
훈련 Python · 22번Python음수 인덱스 + 슬라이스 역순
s = "SOFTWARE" print(s[-1] + s[0], s[2:5][::-1])
정답ES WTF
s[-1]='E', s[0]='S' → "ES". s[2:5]="FTW"를 뒤집으면 "WTF". 슬라이스에 또 슬라이스를 거는 2단 연산.
훈련 Python · 23번Pythonbool은 숫자다
print(True + True, int("3") + 4)
정답2 7
True는 1이므로 1+1=2. int("3")은 문자열→정수 변환. "3"+4였다면 TypeError — 타입 구분이 함정.
훈련 Python · 24번Pythonmax(key=) + values()
d = {'kim': 85, 'lee': 92, 'park': 78} print(max(d, key=d.get), min(d.values()))
정답lee 78
max(d, key=d.get) = "값이 가장 큰 "(92의 lee). min(d.values())는 값 중 최소 78. 딕셔너리 집계의 양대 관용구.
훈련 Python · 25번Python중첩 리스트 인덱싱
m = [[1, 2], [3, 4], [5, 6]] print(m[1][0] + m[2][1])
정답9
m[1][0]=3(두 번째 묶음의 첫 값), m[2][1]=6 → 9. "바깥 번호 먼저, 안쪽 번호 나중".
훈련 Python · 26번Python문자열 곱 + in 연산
print("ab" * 2, "cd" in "abcde")
정답abab True
문자열×n = n번 반복. in은 연속 부분 문자열 검사 — "abcde" 안에 "cd"가 붙어 있으므로 True.
훈련 Python · 27번Pythonpop / insert 조합
a = [1, 2, 3, 4] a.pop() a.pop(0) a.insert(1, 9) print(a)
정답[2, 9, 3]
pop()은 끝(4 제거), pop(0)은 앞(1 제거) → [2,3] → insert(1,9)로 1번 자리에 끼움. 한 연산마다 리스트를 다시 적으세요.
훈련 Python · 28번Pythonget의 기본값
d = {'a': 1} print(d.get('b', 0) + d.get('a', 0))
정답1
get은 키가 없으면 기본값을 반환하고 에러를 내지 않음(0+1=1). d['b']였다면 KeyError — get과 대괄호의 차이가 출제 포인트.
훈련 Python · 29번Pythonreversed + 자릿수 조립
r = 0 for i in reversed(range(3)): r = r * 10 + i print(r)
정답210
i가 2,1,0 순으로: r=2 → 21 → 210. r*10+i는 "자릿수 왼쪽으로 밀고 붙이기" — 숫자 조립의 표준 패턴.
훈련 Python · 30번Pythonlambda key 정렬
pairs = [(1, 3), (2, 1), (3, 2)] pairs.sort(key=lambda p: p[1]) print(pairs[0][0], pairs)
정답2 [(2, 1), (3, 2), (1, 3)]
두 번째 값(3,1,2) 기준 정렬 → (2,1)이 맨 앞, 그 첫 값 2. lambda = "이름 없는 즉석 기준 함수".

직접 돌려 보는 법

파이썬이 깔려 있으니 코드를 main.py 로 저장하고 파워셸에서 python main.py 를 치면 된다. 한 줄짜리는 python -c "print('abc'[::-1])" 처럼 바로 확인한다.

python -c "s = '_THIS_IS_KIM_SPEAKING'; print(s[:4] + s[6:8] + s[18:])"

위 명령은 이 노트를 만든 컴퓨터의 Python 3.12 에서 실행해 _THIISING 이 나온 것이다. 이 장의 기출 15개 · 훈련 30개도 같은 방법으로 확인했다.

07백지 재현

왜 이걸 하나 — 아래를 안 보고 적을 수 있어야 이 장이 끝난다.