20260401 오늘의 학습: COS Pro 기출 1회차 풀이 (6~10번)

Yesol Lee·2026년 4월 1일

COS Python

목록 보기
12/30

지난 학습 요약

  • 구름EDU 기출 1회차 1~5번 풀이 완료 (빈칸 3 + 함수 작성 2)
  • 클래스 상속 문법, 인덱스 vs 값 혼동, 그리드 시뮬레이션 초기값 누락 등 실수 포인트 정리
  • Phase 2 본격 시작

오늘 수업 계획

구름EDU COS Pro 1급 기출 1회차 6~10번 문제 풀이 리뷰.
빈칸 채우기 1문제 + 디버깅 2문제 + 함수 작성 2문제 구성.


학습 내용 정리

문제 7 — 병합 and 정렬 (빈칸 채우기)

오름차순으로 정렬된 두 배열을 하나의 정렬된 배열로 합치는 문제. 병합 정렬(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 & 31True and FalseFalse
주의연산자 우선순위가 비교 연산보다 높음조건문에서는 항상 and 사용

COS Pro 시험에서 조건 연결할 때는 반드시 and를 쓸 것!


문제 8 — 누가 당선 되나요 (디버깅)

투표 결과에서 가장 많은 표를 받은 후보 번호를 반환하는 문제. 공동 1위면 번호를 오름차순으로 모두 반환.

버그 위치: 14번 줄

# 수정 전
answer.append(vote_counter[idx])  # 득표수를 넣고 있음

# 수정 후
answer.append(idx)                # 후보 번호를 넣어야 함

핵심: 문제가 요구하는 반환값이 무엇인지 정확히 파악하기. vote_counter[idx]는 idx번 후보의 득표수이고, 문제가 원하는 건 후보 번호 idx 자체다.


문제 9 — 계단 게임 (디버깅)

두 학생이 가위바위보를 하면서 계단을 오르내리는 게임. 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() 한 줄로 처리하는 게 안전하다.


문제 10 — 주식으로 최대 수익을 내세요 (디버깅)

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만 세팅 (산 것)
  • 두 번째 날부터: tmp에 이전 최소가가 있으므로 → 수익 계산 가능 (팔기)

"먼저 팔아보고(answer 갱신) → 그 다음 살지 결정(tmp 갱신)" 이 순서가 하루 뒤 매도 규칙을 보장한다. 순서를 바꾸면 같은 날 사고파는 셈이 되어 [3, 1] 같은 케이스에서 수익이 0이 나오는 버그가 생긴다.


문제 6 — 체스의 나이트 (함수 작성)

체스판 위 나이트의 위치가 주어지면, 한 번에 이동할 수 있는 칸의 개수를 반환하는 문제.

작성한 코드:

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~8r(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' 패턴과 동일하다.


오늘의 결과

  • 기출 1회차 6~10번 완료 (빈칸 1 + 디버깅 3 + 함수 작성 1), 기출 1회차 전체 10문제 완료
  • 주요 포인트: and vs & 차이, max(0, x) 패턴, 주식 문제의 매수/매도 순서 보장 로직
  • 다음 시간: 구름EDU 기출 2회차 시작
profile
문서화를 좋아하는 개발자

0개의 댓글