& vs and 혼동, 범위 체크 불일치 등 실수 포인트 정리ord(), max(0, x) 패턴 새로 학습기출 1번 문제에서 추상 클래스와 상속 개념이 처음 등장했다. Java의 interface/abstract class와 같은 개념이다.
from abc import ABC, abstractmethod
class Book(ABC): # ABC를 상속 = 추상 클래스
@abstractmethod # 자식이 반드시 구현해야 하는 메서드
def get_rental_price(self, day):
pass
ABC = Abstract Base Class@abstractmethod = Java의 abstract 키워드와 동일Book()하면 에러)문제 코드에서는 metaclass=ABCMeta 방식이 사용되었는데, ABC를 상속하는 것과 동일한 의미이다.
# 방법 1: metaclass 직접 지정 (기출 코드 방식)
class Book(metaclass=ABCMeta):
...
# 방법 2: ABC 상속 (더 간단, 실무에서 주로 사용)
class Book(ABC):
...
# Java: class ComicBook extends Book
# Python: class ComicBook(Book)
class ComicBook(Book):
def get_rental_price(self, day): # 추상 메서드 구현
cost = 500
day -= 2
if day > 0:
cost += day * 200
return cost
같은 구조로 Vehicle 추상 클래스 → SmallCar, LargeCar 상속 문제를 풀었다. 기출 구조를 그대로 응용해서 직접 클래스를 작성하고 solution 함수까지 완성했다.
주의: type은 Python 내장 함수명이라 변수명으로 쓰면 내장 type()을 덮어쓴다. car_type 같은 이름이 안전하다. (이전에 sum을 변수명으로 쓴 것과 같은 패턴!)
빈칸 채우기 문제. "HH:MM" 문자열을 분 단위 정수로 변환하는 func_a가 핵심이었다.
def func_a(times):
hour = int(times[:2])
minute = int(times[3:])
return hour * 60 + minute
도착 시간이 순서대로 정렬되어 있으므로, 현재 시간 이후인 첫 번째 지하철을 찾으면 바로 break하는 패턴이다.
func_a, func_b, func_c처럼 이름만으로 역할을 알 수 없는 함수가 나오는 빈칸 채우기 문제.
역할 파악 팁: 간단한 값을 넣어서 결과를 머릿속으로 돌려보기
| 함수 | 동작 | 예시 |
|---|---|---|
func_a(n) | 10^n (10을 n번 곱함) | func_a(3) → 1000 |
func_b(n) | 자릿수 구하기 (n //= 10 + 카운트) | func_b(235) → 3 |
func_c(n) | 각 자릿수 합 (n % 10 + 누적합) | func_c(235) → 10 |
자주 나오는 숫자 처리 패턴:
| 패턴 | 동작 |
|---|---|
n //= 10 + 카운트 | 자릿수 구하기 |
n % 10 + 누적합 | 각 자릿수 합 |
10을 반복 곱하기 | 10의 거듭제곱 |
n % 10 + 역순 조립 | 숫자 뒤집기 |
수업 중 질문: "func_a, func_b, func_c 역할 파악하는데 시간이 오래 걸렸어"
→ 코드를 한 줄씩 읽기 전에 간단한 값을 넣어서 입출력을 먼저 확인하면 빠르게 파악할 수 있다. 이런 패턴은 반복 출제되므로 몇 번 더 보면 코드 읽기 전에 바로 알아볼 수 있게 된다.
팁: length / 2는 Python 3에서 float가 된다 (예: 6 / 2 → 3.0). 정수 나눗셈 //를 쓰는 습관을 들이자.
함수 작성 문제에서 itertools.combinations가 처음 등장했다. 배열에서 n개를 뽑는 모든 조합을 구하는 도구이다.
from itertools import combinations
arr = [1, 2, 3, 4, 5]
for combo in combinations(arr, 3): # 3개씩 뽑기
print(combo)
# (1, 2, 3), (1, 2, 4), (1, 2, 5), ...
Java로 비유하면 for문 3중첩으로 조합을 구하는 걸 한 줄로 해주는 것이다.
// Java: 3중 for문
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
for (int k = j+1; k < n; k++)
# Python: 한 줄
for combo in combinations(arr, 3)
실수 포인트: combinations(arr, K)로 썼다가 교정했다. K=3이라 우연히 맞았지만, K는 배수 조건(변수)이고 뽑는 개수는 3(상수)이다. 문제에서 변수와 상수를 정확히 구분하자!
from itertools import combinations
def solution(arr, K):
answer = 0
for combo in combinations(arr, 3): # 3개 뽑기 (상수!)
if sum(combo) % K == 0: # K의 배수 (변수!)
answer += 1
return answer
연속된 0을 하나의 0으로 압축하는 디버깅 문제. 한 줄만 수정해야 한다.
# 버그 코드
if s[i] == '0' and s[i + 1] != '0':
answer += '0' # 연속 0의 마지막 → 0 추가 (정상)
else:
answer += '1' # 버그! 무조건 '1' 추가
else에 들어오는 경우가 세 가지 섞여있었다:
s[i] == '1' → '1' 추가해야 함s[i] == '0' (연속 0) → 아무것도 안 해야 함s[i] == '#' (끝 표시) → 아무것도 안 해야 함수정: 11행을 if s[i] == '1': answer += '1'로 변경
else:
if s[i] == '1': answer += '1' # '1'일 때만 추가, 나머지는 자동 패스
Python은 한 줄에 if 조건: 동작을 쓸 수 있어서 한 줄 수정으로 해결 가능하다.
수업 중 질문: "else: if 대신 그냥 if만 쓰거나, elif를 써도 똑같지 않아?"
→ 안 된다! 11행은 else: 블록 안에 있는 코드라서, elif로 바꾸려면 else:(10행)도 지워야 해서 두 줄 수정이 된다. 독립 if도 마찬가지.
디버깅 팁: else에서 무조건 고정값을 넣는 코드가 보이면 의심하자!
-= 공백 실수 주의응용문제에서 발견한 실수:
hours -= 1 # hours = hours - 1 (3 → 2) ✅
hours = -1 # hours에 -1 대입 (3 → -1) ❌
+=는 헷갈릴 일이 없지만, -=는 공백 하나로 의미가 완전히 바뀐다. 시험에서는 반드시 붙여서 쓰자!