구름EDU COS Pro 1급 기출 1회차 6~10번 문제 풀이 리뷰.
빈칸 채우기 1문제 + 디버깅 2문제 + 함수 작성 2문제 구성.
오름차순으로 정렬된 두 배열을 하나의 정렬된 배열로 합치는 문제. 병합 정렬(merge sort)의 merge 단계와 같은 로직.
빈칸:
while arrA_len > arrA_idx and arrB_len > arrB_idx: # 빈칸 1: 두 배열 모두 남아있을 때
...비교하며 작은 값 append...
while arrA_len > arrA_idx: # 빈칸 2: arrA에 남은 원소 처리
...
while arrB_len > arrB_idx: # 빈칸 3: arrB에 남은 원소 처리
...
수업 중 질문: &랑 and는 다른 거야?
→ Python에서 &는 비트 연산자, and는 논리 연산자다.
& (비트) | and (논리) | |
|---|---|---|
| 용도 | 비트 단위 AND | 조건 연결 |
| 예시 | 5 & 3 → 1 | True and False → False |
| 주의 | 연산자 우선순위가 비교 연산보다 높음 | 조건문에서는 항상 and 사용 |
COS Pro 시험에서 조건 연결할 때는 반드시 and를 쓸 것!
투표 결과에서 가장 많은 표를 받은 후보 번호를 반환하는 문제. 공동 1위면 번호를 오름차순으로 모두 반환.
버그 위치: 14번 줄
# 수정 전
answer.append(vote_counter[idx]) # 득표수를 넣고 있음
# 수정 후
answer.append(idx) # 후보 번호를 넣어야 함
핵심: 문제가 요구하는 반환값이 무엇인지 정확히 파악하기. vote_counter[idx]는 idx번 후보의 득표수이고, 문제가 원하는 건 후보 번호 idx 자체다.
두 학생이 가위바위보를 하면서 계단을 오르내리는 게임. A가 이기면 +3칸, 지면 -1칸, 비기면 제자리. 단, 0칸 아래로는 내려갈 수 없음.
func 함수 동작:
def func(record): # 이기는 패를 반환
0(가위) → 1(바위)
1(바위) → 2(보)
2(보) → 0(가위)
버그 위치: 19번 줄
# 수정 전
cnt = cnt - 1 # 0 아래로 내려갈 수 있음
# 수정 후
cnt = max(0, cnt - 1) # 0 아래로 못 내려가게 보호
기억 포인트: max(0, 값)은 "0 아래로 내려가지 않게" 할 때 자주 쓰는 패턴. 시험에서 디버깅은 한 줄 교체이므로, if문을 추가하는 것보다 max() 한 줄로 처리하는 게 안전하다.
n일 동안의 주가에서 한 번 사고 한 번 팔았을 때 최대 수익을 구하는 문제. 산 날에 바로 못 팔고, 최소 하루 뒤에 팔아야 한다. 수익이 음수일 수도 있다.
버그 위치: 10번 줄
# 수정 전
answer = max(answer, tmp - price) # 매수가 - 판매가 (반대!)
# 수정 후
answer = max(answer, price - tmp) # 판매가 - 매수가 (정답!)
코드 구조 이해:
for price in prices:
if tmp != INF: # ① 먼저 팔아보기 (매수한 적 있을 때만)
answer = max(answer, price - tmp)
tmp = min(tmp, price) # ② 그 다음 사볼지 결정
수업 중 질문: if tmp != INF: 이 조건은 왜 있는 거야?
→ 이 조건은 "산 날에 바로 못 팔고, 최소 하루 뒤에 팔아야 한다" 규칙을 지키기 위한 것이다.
tmp=INF → if 건너뜀 → tmp만 세팅 (산 것)"먼저 팔아보고(answer 갱신) → 그 다음 살지 결정(tmp 갱신)" 이 순서가 하루 뒤 매도 규칙을 보장한다. 순서를 바꾸면 같은 날 사고파는 셈이 되어 [3, 1] 같은 케이스에서 수익이 0이 나오는 버그가 생긴다.
체스판 위 나이트의 위치가 주어지면, 한 번에 이동할 수 있는 칸의 개수를 반환하는 문제.
작성한 코드:
def solution(pos):
answer = 0
r = "ABCDEFGH".find(pos[0]) # A=0, B=1, ... H=7
c = int(pos[1]) - 1 # 1~8 → 0~7로 통일
moves = [(-2, -1), (-2, 1), (-1, -2), (-1, 2),
(1, -2), (1, 2), (2, -1), (2, 1)]
for move in moves:
nr, nc = r + move[0], c + move[1]
if nr >= 0 and nr <= 7 and nc >= 0 and nc <= 7:
answer += 1
return answer
풀면서 실수한 포인트:
| 실수 | 원인 | 수정 |
|---|---|---|
범위 체크 0~8 | r(0~7)과 c(1~8)의 범위가 달랐음 | c를 -1해서 둘 다 0~7로 통일 |
위치 파싱 두 가지 방법:
# 방법 1: find()
r = "ABCDEFGH".find(pos[0])
# 방법 2: ord()
r = ord(pos[0]) - ord('A')
ord()는 문자를 아스키 코드(숫자)로 변환하는 함수. chr()는 반대. Java의 (char) - 'A' 패턴과 동일하다.
and vs & 차이, max(0, x) 패턴, 주식 문제의 매수/매도 순서 보장 로직