Phase 2 첫 번째 세션. 구름EDU COS Pro 1급 기출 1회차 1~5번 문제를 직접 풀고 리뷰.
빈칸 채우기 3문제 + 함수 작성 2문제 구성.
클래스 상속 구조를 읽고 빈칸을 채우는 문제.
빈칸:
class PizzaStore(DeliveryStore): # 1. 상속
def set_order_list(self, order_list): # 2. 추상 메서드 구현
def get_total_price(self): # 3. 추상 메서드 구현
Python 클래스 상속 문법 정리:
| Java | Python | |
|---|---|---|
| 상속 | class Child extends Parent | class Child(Parent): |
| 인터페이스 구현 | class A implements B | class A(B): (동일 문법) |
| 추상 메서드 | @Override | 같은 이름으로 그냥 정의 (시그니처 맞춰야 함) |
| 추상 클래스 선언 | abstract class | metaclass=ABCMeta + @abstractmethod |
핵심: Python에서 추상 메서드를 구현할 때는 self를 포함한 시그니처를 부모와 동일하게 맞춰야 한다.
이 문제에서 함수명은 바로 알았지만 상속 문법은 인터넷 검색 후 해결. → 별도 정리 필요 영역으로 기록.
두 이진수 문자열의 해밍 거리(같은 위치에서 다른 문자 수)를 구하는 문제.
길이가 다르면 짧은 쪽 앞에 0을 채워 맞춤.
빈칸:
padSize = length - len(string) # 채워야 할 0의 개수
if binaryA[i] != binaryB[i]: # 같은 위치에서 다르면 해밍 거리 +1
막힘 없이 해결.
"123+12" 같은 문자열 수식을 받아 계산 결과를 return하는 문제.
func_a (계산), func_b (연산자 위치 탐색), func_c (숫자 분리) 세 함수가 주어지고, solution의 빈칸을 채우는 구조.
빈칸:
exp_index = func_b(expression) # 연산자 위치(인덱스)
first_num, second_num = func_c(expression, exp_index) # 두 숫자 분리
result = func_a(first_num, second_num, expression[exp_index]) # 계산
수업 중 질문: 마지막 인자를 exp_index로 넣었더니 None이 출력됐어
→ exp_index는 연산자의 위치를 나타내는 숫자(int) 이고, func_a가 필요로 하는 건 '+', '-', '*' 같은 문자(str) 다.
expression[exp_index]로 인덱스 위치의 값을 꺼내야 한다.
exp_index = 3 # 숫자 — 위치
expression[exp_index] # 문자 — 그 위치의 값 '+'
기억 포인트: 인덱스를 구했으면 값을 꺼낼 때 [인덱스]를 한 번 더 써줘야 한다.
0이 없는 수 체계(1, 2, ..., 9, 11, 12, ...)에서 주어진 수의 다음 수를 return하는 문제.
작성한 코드:
def solution(num):
tmp_num = str(num + 1)
answer = int(tmp_num.replace("0", "1"))
return answer
왜 이게 맞는가?
num은 0이 없는 수이므로, num + 1을 하면 올림(carry)이 9를 타고 올라가면서 0은 반드시 뒤에서부터(suffix)만 생긴다.
예: 1899999 + 1 = 1900000
└─ 뒤의 9들이 연쇄 올림 → suffix에만 0 생성
suffix의 0을 전부 1로 바꾸면 → 0 없는 수 중 가장 작은 다음 수가 된다.
replace("0", "1")이 항상 정답인 이유가 바로 이 입력 조건 덕분이다.
n×n 격자에 1~n²을 소용돌이(나선) 순서로 채운 뒤, 주 대각선(좌상→우하) 값의 합을 return하는 문제.
작성한 코드 (핵심 구조):
def solution(n):
if n == 1: return 1 # 엣지케이스
grid = [[0]*n for _ in range(n)]
dr = [0, 1, 0, -1] # 우 하 좌 상
dc = [1, 0, -1, 0]
r, c, d = 0, 0, 0
answer = 0
for num in range(1, n*n+1):
grid[r][c] = num
if r == c:
answer += num
nr, nc = r + dr[d], c + dc[d]
if nr < 0 or nr >= n or nc < 0 or nc >= n:
d = (d+1) % 4
nr, nc = r + dr[d], c + dc[d]
if grid[nr][nc] != 0:
d = (d+1) % 4
nr, nc = r + dr[d], c + dc[d]
r, c = nr, nc
return answer
풀면서 실수한 포인트:
| 실수 | 원인 | 수정 |
|---|---|---|
d = 0 누락 | 방향 초기값 빠트림 | 그리드+4방향+시작점+현재방향 세트로 기억 |
range(n*n) | 0부터 시작해 합계 틀림 | range(1, n*n+1) |
(d+1) % 4 헷갈림 | 방향 순환 공식 | 0→1→2→3→0 반복, 항상 % 4 |
대각선 조건: r == c 이면 주 대각선. 단순하고 정확한 판별식.
그리드 시뮬레이션 세팅 체크리스트:
1. 그리드 생성
2. 4방향 정의 (dr, dc)
3. 시작점 (r, c)
4. 현재 방향 (d = 0) ← 자주 빠트림!