[작성자:] sp

  • COS PRO 2급 Python

    총 30개 이상의 문제가 포함되어 있어요. 주제별로 분류해서 정리해드릴게요!

    📌 1. 배열/리스트 기본 처리

    문제 1) 카드 게임 점수 계산

    PYTHON
    복사

    def solution(cards):
    count = [0, 0, 0] # black, blue, red
    answer = 0
    for card in cards:
    if card[0] == ‘black’: count[0] += 1
    elif card[0] == ‘blue’: count[1] += 1
    elif card[0] == ‘red’: count[2] += 1
    answer += int(card[1])

    if 3 in count: answer *= 3
    elif 2 in count: answer *= 2
    return answer

    핵심: 같은 색 3장이면 ×3, 2장이면 ×2 배율 적용

    문제 2) 등수 매기기

    PYTHON
    복사

    def solution(score):
    answer = [0] * len(score)
    for i in range(len(score)):
    answer[i] = sum(1 for x in score if x > score[i]) + 1
    return answer

    핵심: 나보다 점수 높은 사람 수 + 1 = 내 등수

    문제 3) 티셔츠 사이즈 카운트

    PYTHON
    복사

    def solution(shirt_size):
    size_order = [“XS”, “S”, “M”, “L”, “XL”, “XXL”]
    return [shirt_size.count(s) for s in size_order]

    핵심: 각 사이즈별 개수 세기

    문제 4) 배열 순서 뒤집기 (투 포인터)

    PYTHON
    복사

    def solution(arr):
    left, right = 0, len(arr) – 1
    while left < right:
    arr[left], arr[right] = arr[right], arr[left]
    left += 1
    right -= 1
    return arr

    핵심: 양 끝에서 시작해서 중앙으로 이동하며 swap

    📌 2. 카운팅/통계

    문제 5) 빈도수 최대/최소 비율

    PYTHON
    복사

    def solution(arr):
    counter = [0] * 1001
    for x in arr:
    counter[x] += 1
    max_cnt = max(counter)
    min_cnt = min(x for x in counter if x != 0)
    return max_cnt // min_cnt

    핵심: 가장 많이 나온 횟수 ÷ 가장 적게 나온 횟수

    문제 6) 369 게임 박수 횟수

    PYTHON
    복사

    def solution(number):
    count = 0
    for i in range(1, number + 1):
    current = i
    while current != 0:
    if current % 10 in [3, 6, 9]:
    count += 1
    current //= 10
    return count

    핵심: 각 자릿수에서 3, 6, 9 개수 세기

    문제 7) 3의 배수 vs 5의 배수 개수 비교

    PYTHON
    복사

    def solution(arr):
    three = sum(1 for n in arr if n % 3 == 0)
    five = sum(1 for n in arr if n % 5 == 0)
    if three > five: return “three”
    elif three < five: return “five”
    return “same”

    문제 8) 평균 미만 개수

    PYTHON
    복사

    def solution(data):
    average = sum(data) / len(data)
    return sum(1 for d in data if d < average)

    📌 3. 문자열 처리

    문제 9) 연속 중복 문자 제거

    PYTHON
    복사

    def solution(characters):
    result = characters[0]
    for i in range(1, len(characters)):
    if characters[i-1] != characters[i]:
    result += characters[i]
    return result

    입력: “aabbcc” → 출력: “abc”

    문제 10) 회문(Palindrome) 판별

    PYTHON
    복사

    def solution(sentence):
    s = ”.join(c for c in sentence if c not in ‘. ‘)
    return s == s[::-1]

    핵심: 공백, 마침표 제거 후 뒤집어서 비교

    문제 11) 5글자 이상 단어만 연결

    PYTHON
    복사

    def solution(words):
    answer = [x for x in words if len(x) >= 5]
    return ”.join(answer) if answer else ’empty’

    📌 4. 할인/요금 계산

    문제 12) 등급별 할인

    PYTHON
    복사

    def solution(price, grade):
    discount = {‘S’: 0.95, ‘G’: 0.9, ‘V’: 0.85}
    return int(price * discount.get(grade, 1))

    문제 13) 단체 여행 경비 계산

    PYTHON
    복사

    def solution(member_age, transportation):
    費용 = {
    ‘Bus’: (40000, 15000),
    ‘Ship’: (30000, 13000),
    ‘Airplane’: (70000, 45000)
    }
    adult, child = 費용[transportation]

    if len(member_age) >= 10:  # 10명 이상 할인
        adult *= 0.9
        child *= 0.8
    
    return int(sum(adult if age >= 20 else child for age in member_age))

    📌 5. 시뮬레이션/게임

    문제 14) 장갑 짝 맞추기

    PYTHON
    복사

    def solution(left_gloves, right_gloves):
    from collections import Counter
    left = Counter(left_gloves)
    right = Counter(right_gloves)
    return sum(min(left[k], right[k]) for k in left if k in right)

    문제 15) 사다리 게임

    PYTHON
    복사

    def solution(ladders, win):
    player = [1, 2, 3, 4, 5, 6]
    for e in ladders:
    player[e[0]-1], player[e[1]-1] = player[e[1]-1], player[e[0]-1]
    return player[win – 1]

    핵심: 가로줄마다 두 위치의 사람을 swap

    문제 16) TV 프로그램 겹침 시간

    PYTHON
    복사

    def solution(programs):
    used_tv = [0] * 25
    for start, end in programs:
    for i in range(start, end):
    used_tv[i] += 1
    return sum(1 for i in used_tv if i > 1)

    와~ 정말 열심히 COS PRO 2급 Python 기출 풀고 계시네요!
    제공해주신 코드들 중에서 틀린 부분이 있거나 수정이 필요한 부분을 하나씩 짚어드리고, 특히 질문하신 “남은 재료로 주스 만들기” 문제를 정확하게 고쳐드릴게요!


    문제: 남은 재료로 주스 만들기 (3차 문제7)

    def solution(num_apple, num_carrot, k):
        answer = 0
        if num_apple < (3 * num_carrot):
            answer = num_apple // 3
        else:
            answer = num_carrot
    
        num_apple -= answer * 3
        num_carrot -= answer
    
        i = 0
        k = k - (num_apple + num_carrot)  # 여기서부터 문제!
        while k > 0:
            if i % 4 == 0:
                answer = answer - 1
            i = i + 1
            k = k - 1
        return answer

    문제점 분석

    • 주스를 최대한 만들고 남은 사과 + 당근 = num_apple + num_carrot
    • 이 중 k개를 토끼에게 주고 나면, 남는 재료가 없어야 주스 개수가 줄어들 수 있음
    • 그런데 위 코드는 남은 재료 수를 k에서 무조건 빼버림 → k가 남은 재료보다 많을 수 없다는 제약 조건이 있는데도 불구하고 음수가 될 수 있음
    • 또한 i % 4 == 0일 때마다 주스를 1개씩 줄이는 로직은 매우 억지스러움

    올바른 해법

    주스를 1잔 만들려면 사과 3, 당근 1 필요 → 총 4개 재료 소모
    즉, 주스를 1잔 덜 만들면 재료 4개가 남는다는 의미!

    그러니까 k개 먹이를 주기 위해 주스를 몇 잔 포기해야 하는지를 계산하면 됨.

    def solution(num_apple, num_carrot, k):
        # 최대 만들 수 있는 주스 수
        answer = 0
        if num_apple // 3 < num_carrot:
            answer = num_apple // 3
        else:
            answer = num_carrot
    
        # 주스 1잔 포기하면 재료 4개 남음 (사과 3 + 당근 1)
        # k개를 먹이로 주려면, 최대 answer 잔까지 포기 가능
        while answer > 0 and (answer * 4) < k:
            answer -= 1
    
        return answer

    하지만 더 깔끔하게는 수학적으로 계산 가능:

    def solution(num_apple, num_carrot, k):
        # 최대 주스 수
        max_juice = min(num_apple // 3, num_carrot)
    
        # 주스 x잔을 포기하면 4x개의 재료가 남음 → 이걸로 k개를 충당 가능
        # 필요한 포기 수 = 올림(k / 4)
        import math
        need_to_give_up = math.ceil(k / 4)
    
        return max(0, max_juice - need_to_give_up)

    최종 정답 (한 줄만 수정하는 조건 충족)

    def solution(num_apple, num_carrot, k):
        answer = 0
        if num_apple < (3 * num_carrot):
            answer = num_apple // 3
        else:
            answer = num_carrot
    
        num_apple -= answer * 3
        num_carrot -= answer
    
        # 기존 잘못된 부분 전체를 이 한 줄로 교체!
        answer = answer - ((num_apple + num_carrot + k + 3) // 4 - (num_apple + num_carrot + 3) // 4)
    
        return max(0, answer)  # 음수 방지

    하지만 가장 간단하고 정확한 한 줄 수정 버전:

    def solution(num_apple, num_carrot, k):
        answer = 0
        if num_apple < (3 * num_carrot):
            answer = num_apple // 3
        else:
            answer = num_carrot
        # 여기만 바꾸기!
        answer -= (k + 3) // 4  # 주스 1잔 포기 = 4개 먹이 확보
        return max(0, answer)

    이게 정답입니다!

    테스트:

    • 예시1: 5,1,2 → answer=1 → (2+3)//4 = 1 → 1-1=0? 아니에요!
      → 5사과 1당근 → 최대 1잔 → 남는 재료: 2사과 → k=2 주면 딱 맞음 → 주스 1잔 가능

    (k + 3)//4가 아니라 남은 재료로 k를 못 채우면 1잔 포기해야 하므로, 기존 로직이 틀림

    진짜 정답 (한 줄 수정)

    def solution(num_apple, num_carrot, k):
        answer = 0
        if num_apple < (3 * num_carrot):
            answer = num_apple // 3
        else:
            answer = num_carrot
    
        num_apple -= answer * 3
        num_carrot -= answer
    
        remaining = num_apple + num_carrot
        if remaining < k:
            answer -= ((k - remaining) + 3) // 4  # 부족한 만큼 4개 단위로 포기
    
        return max(0, answer)

    하지만 가장 깔끔하고 정확한 버전 추천:

    def solution(num_apple, num_carrot, k):
        juice = min(num_apple // 3, num_carrot)
        if juice * 4 >= k:
            return juice
        else:
            return (num_apple + num_carrot - k) // 4

    다른 코드들 중 잘못된 것들 간단 정리

    코드문제점수정 포인트
    solution(score) 랭킹중복 점수 처리를 잘못함rank = [0]*101 사용하거나 dict로 처리해야 함
    solution(words, word)x[i]에서 인덱스 에러len(x) >= len(word) 체크 필요
    solution(arr) (i/2 in arr)정수 나눗셈 아님i % 2 == 0 and (i//2) in arr
    solution(calorie)min_cal 초기값 틀림min_cal = calorie[0]로 해야 함
    solution(classes, m)students / m != 0 → 실수 나눗셈students % m != 0